something like this ? ...
(function () {
function dispatch(callback) {
callback.call(this.r, this.e);
}
function add(callback) {
this.handlers.indexOf(callback) < 0 &&
this.handlers.push(callback);
}
function remove(callback) {
var i = this.handlers.indexOf(callback);
-1 < i && this.handlers.splice(i, 1);
}
function createListener(self, listeners, name) {
function listener(evt) {
handlers.forEach(dispatch, {r: self, e: evt});
}
var handlers = [];
listener.handlers = handlers;
listener.add = add;
listener.remove = remove;
listener.fire = listener; // redundant
return listeners[name] = listener;
}
function Event(self, listeners) {
return Proxy.create({
delete: function (receiver, name) {
delete listeners[name];
},
get: function (receiver, name) {
return listeners.hasOwnProperty(name) ?
listeners[name] :
createListener(self, listeners, name)
;
}
});
}
var event = "event";
Object.defineProperty(Object.prototype, "on", {
enumerable: false,
configurable: false,
get: function () {
return this[event] || Object.defineProperty(
this, event, {
enumerable: false,
configurable: false,
writable: false,
value: Event(this, {})
}
)[event];
}
});
}());
// generic clalback
function click(e) {
alert(e.type);
}
// generic object
var object = {};
// magic "on"
object.on.click.add(click); // add
object.on.click({type: "click"}); // fire
object.on.click.remove(click); // remove
object.on.click({type: "click"}); // nothing
delete object.on.click;
gisted already: https://gist.github.com/1289809
best regards
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss