docs: function(target, handler, types) {
  
  			/* 
  			 * 1. Objects by default convert to edb.Object
  			 * 2. Arrays by default convert to edb.Array
  			 * 3. Simple properties get target accessors
  			 *
  			 * TODO: Setup now proxies array indexes,
  			 * unsupport this or re-approximate on changes
  			 *
  			 * TODO: when resetting array, make sure that
  			 * it becomes xx.MyArray (not plain edb.Array)
  			 */
  			gui.Object.nonmethods(target).forEach(function(key) {
  				var desc = Object.getOwnPropertyDescriptor(target, key);
  				if (desc.configurable) {
  					Object.defineProperty(handler, key, {
  						enumerable: desc.enumerable,
  						configurable: desc.configurable,
  						get: getter(key, function() {
  							if (desc.get) {
  								return desc.get.call(this);
  							} else {
  								return types[key] || target[key];
  							}
  						}),
  						set: setter(key, function(value) {
  							var Type, type;
  							if (desc.set) {
  								desc.set.call(this, value);
  							} else {
  								if ((type = types[key])) {
  									if (edb.Type.is(value)) {
  										types[key] = value;
  									} else {
  										Type = type.constructor; // TODO: filter function support!
  										types[key] = Type.from(value); // new Type ( value );
  									}
  								} else {
  									target[key] = edb.Type.cast(value);
  								}
  							}
  						})
  					});
  				}
  			});
  			gui.Object.ownmethods(target).forEach(function(key) {
  				handler[key] = target[key];
  			});
  		}