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

Reply via email to