text: /*
  ---
  
  name: "Accessors"
  
  description: "Implementing accessors"
  
  license:
  	- "[GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)"
  	- "[MIT License](http://opensource.org/licenses/mit-license.php)"
  
  requires:
  	- Core
  
  provides: accessors
  
  ...
  */
  
  (function (Object) {
  	var standard = !!Object.getOwnPropertyDescriptor, nonStandard = !!{}.__defineGetter__;
  
  	if (!standard && !nonStandard) throw new Error('Accessors are not supported');
  
  	var lookup = nonStandard ?
  		function (from, key, bool) {
  			var g = from.__lookupGetter__(key), s = from.__lookupSetter__(key), has = !!(g || s);
  
  			if (bool) return has;
  
  			return has ? { get: g, set: s } : null;
  		} :
  		function (from, key, bool) {
  			var descriptor = Object.getOwnPropertyDescriptor(from, key);
  			if (!descriptor) {
  				// try to find accessors according to chain of prototypes
  				var proto = Object.getPrototypeOf(from);
  				if (proto) return atom.accessors.lookup(proto, key, bool);
  			} else if ( descriptor.set || descriptor.get ) {
  				if (bool) return true;
  
  				return {
  					set: descriptor.set,
  					get: descriptor.get
  				};
  			}
  			return bool ? false : null;
  		}; /* lookup */
  
  	var define = nonStandard ?
  		function (object, prop, descriptor) {
  			if (descriptor) {
  				if (descriptor.get) object.__defineGetter__(prop, descriptor.get);
  				if (descriptor.set) object.__defineSetter__(prop, descriptor.set);
  			}
  			return object;
  		} :
  		function (object, prop, descriptor) {
  			if (descriptor) {
  				var desc = {
  					get: descriptor.get,
  					set: descriptor.set,
  					configurable: true,
  					enumerable: true
  				};
  				Object.defineProperty(object, prop, desc);
  			}
  			return object;
  		};
  
  	atom.accessors = {
  		lookup: lookup,
  		define: function (object, prop, descriptor) {
  			if (typeof prop == 'object') {
  				for (var i in prop) define(object, i, prop[i]);
  			} else {
  				define(object, prop, descriptor);
  			}
  			return object;
  		},
  		has: function (object, key) {
  			return atom.accessors.lookup(object, key, true);
  		},
  		inherit: function (from, to, key) {
  			var a = atom.accessors.lookup(from, key);
  
  			if ( a ) {
  				atom.accessors.define(to, key, a);
  				return true;
  			}
  			return false;
  		}
  	};
  })(Object);
  