docs: function parse_field(obj, key, value) {
  		debug.assert(obj).is('object');
  		//debug.log('obj = ', obj);
  		//debug.log('key = ', key);
  		//debug.log('value = ', value);
  
  		/* Parse full top level field */
  		function parse_field_top(obj, key, value) {
  			if( is.array(obj['$'+key]) ) {
  				obj['$'+key] = obj['$'+key].concat(value);
  			} else if( is.obj(obj['$'+key]) ) {
  				obj['$'+key] = merge(obj['$'+key], value);
  			} else {
  				obj['$'+key] = value;
  			}
  		}
  
  		/* Parse property in top level field based on a key as an array `[datakey, property_name]` */
  		function parse_field_property(obj, key, value) {
  			//debug.log('key = ', key);
  			var a = key[0];
  			var b = key[1];
  			//debug.log('key_a = ', a);
  			//debug.log('key_b = ', b);
  
  			if(!is.obj(obj['$'+a])) {
  				obj['$'+a] = {};
  			}
  
  			obj['$'+a][b] = value;
  		}
  
  		/* Parse property in top level field based on key in PostgreSQL JSON format */
  		function parse_field_property_pg(obj, key, value) {
  			//debug.log('key = ', key);
  			/*jslint regexp: false*/
  			var matches = /^([a-z][a-z0-9\_]*)\-\>\>'([^\']+)'$/.exec(key);
  			/*jslint regexp: true*/
  			var a = matches[1];
  			var b = matches[2];
  			return parse_field_property_pg(obj, [a,b], value);
  		}
  
  		//
  		var new_key;
  		if( is.func(field_map) && (new_key = field_map(key)) ) {
  			if( (new_key) && (new_key !== key) ) {
  				return parse_field(obj, new_key, value);
  			}
  		}
  
  		if( is.array(key) ) {
  			parse_field_property(obj, key, value);
  		} else if( is.string(key) && (/^[a-z][a-z0-9\_]*$/.test(key)) ) {
  			parse_field_top(obj, key, value);
  		/*jslint regexp: false*/
  		} else if ( is.string(key) && (/^([a-z][a-z0-9\_]*)\-\>\>'([^\']+)'$/.test(key)) ) {
  		/*jslint regexp: true*/
  			parse_field_property_pg(obj, key, value);
  		} else {
  			//debug.log('key = ', key);
  			throw new TypeError("Unknown field name: " + key);
  		}
  	}