You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					122 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					122 lines
				
				2.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Expose `Delegator`.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = Delegator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Initialize a delegator.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {Object} proto
							 | 
						||
| 
								 | 
							
								 * @param {String} target
							 | 
						||
| 
								 | 
							
								 * @api public
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Delegator(proto, target) {
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof Delegator)) return new Delegator(proto, target);
							 | 
						||
| 
								 | 
							
								  this.proto = proto;
							 | 
						||
| 
								 | 
							
								  this.target = target;
							 | 
						||
| 
								 | 
							
								  this.methods = [];
							 | 
						||
| 
								 | 
							
								  this.getters = [];
							 | 
						||
| 
								 | 
							
								  this.setters = [];
							 | 
						||
| 
								 | 
							
								  this.fluents = [];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Delegate method `name`.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {String} name
							 | 
						||
| 
								 | 
							
								 * @return {Delegator} self
							 | 
						||
| 
								 | 
							
								 * @api public
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegator.prototype.method = function(name){
							 | 
						||
| 
								 | 
							
								  var proto = this.proto;
							 | 
						||
| 
								 | 
							
								  var target = this.target;
							 | 
						||
| 
								 | 
							
								  this.methods.push(name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  proto[name] = function(){
							 | 
						||
| 
								 | 
							
								    return this[target][name].apply(this[target], arguments);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return this;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Delegator accessor `name`.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {String} name
							 | 
						||
| 
								 | 
							
								 * @return {Delegator} self
							 | 
						||
| 
								 | 
							
								 * @api public
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegator.prototype.access = function(name){
							 | 
						||
| 
								 | 
							
								  return this.getter(name).setter(name);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Delegator getter `name`.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {String} name
							 | 
						||
| 
								 | 
							
								 * @return {Delegator} self
							 | 
						||
| 
								 | 
							
								 * @api public
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegator.prototype.getter = function(name){
							 | 
						||
| 
								 | 
							
								  var proto = this.proto;
							 | 
						||
| 
								 | 
							
								  var target = this.target;
							 | 
						||
| 
								 | 
							
								  this.getters.push(name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  proto.__defineGetter__(name, function(){
							 | 
						||
| 
								 | 
							
								    return this[target][name];
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return this;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Delegator setter `name`.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {String} name
							 | 
						||
| 
								 | 
							
								 * @return {Delegator} self
							 | 
						||
| 
								 | 
							
								 * @api public
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegator.prototype.setter = function(name){
							 | 
						||
| 
								 | 
							
								  var proto = this.proto;
							 | 
						||
| 
								 | 
							
								  var target = this.target;
							 | 
						||
| 
								 | 
							
								  this.setters.push(name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  proto.__defineSetter__(name, function(val){
							 | 
						||
| 
								 | 
							
								    return this[target][name] = val;
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return this;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Delegator fluent accessor
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {String} name
							 | 
						||
| 
								 | 
							
								 * @return {Delegator} self
							 | 
						||
| 
								 | 
							
								 * @api public
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Delegator.prototype.fluent = function (name) {
							 | 
						||
| 
								 | 
							
								  var proto = this.proto;
							 | 
						||
| 
								 | 
							
								  var target = this.target;
							 | 
						||
| 
								 | 
							
								  this.fluents.push(name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  proto[name] = function(val){
							 | 
						||
| 
								 | 
							
								    if ('undefined' != typeof val) {
							 | 
						||
| 
								 | 
							
								      this[target][name] = val;
							 | 
						||
| 
								 | 
							
								      return this;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return this[target][name];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return this;
							 | 
						||
| 
								 | 
							
								};
							 |