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.
121 lines
2.0 KiB
121 lines
2.0 KiB
|
|
/** |
|
* 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; |
|
};
|
|
|