6 module.exports = Delegator;
9 * Initialize a delegator.
11 * @param {Object} proto
12 * @param {String} target
16 function Delegator(proto, target) {
17 if (!(this instanceof Delegator)) return new Delegator(proto, target);
27 * Delegate method `name`.
29 * @param {String} name
30 * @return {Delegator} self
34 Delegator.prototype.method = function(name){
35 var proto = this.proto;
36 var target = this.target;
37 this.methods.push(name);
39 proto[name] = function(){
40 return this[target][name].apply(this[target], arguments);
47 * Delegator accessor `name`.
49 * @param {String} name
50 * @return {Delegator} self
54 Delegator.prototype.access = function(name){
55 return this.getter(name).setter(name);
59 * Delegator getter `name`.
61 * @param {String} name
62 * @return {Delegator} self
66 Delegator.prototype.getter = function(name){
67 var proto = this.proto;
68 var target = this.target;
69 this.getters.push(name);
71 proto.__defineGetter__(name, function(){
72 return this[target][name];
79 * Delegator setter `name`.
81 * @param {String} name
82 * @return {Delegator} self
86 Delegator.prototype.setter = function(name){
87 var proto = this.proto;
88 var target = this.target;
89 this.setters.push(name);
91 proto.__defineSetter__(name, function(val){
92 return this[target][name] = val;
99 * Delegator fluent accessor
101 * @param {String} name
102 * @return {Delegator} self
106 Delegator.prototype.fluent = function (name) {
107 var proto = this.proto;
108 var target = this.target;
109 this.fluents.push(name);
111 proto[name] = function(val){
112 if ('undefined' != typeof val) {
113 this[target][name] = val;
116 return this[target][name];