// Element Listener Mixin (function(){ var setup = function(element){ var listener = new Events, removeEvent = listener.removeEvent, listener.guid = makeGuid(); listener.removeEvent = function(key, value){ removeEvent(key, value); element.removeEvent(key, value); }; return listener; }; this.Listener = new Class({ attach: function(key, value){ if (!this.$listener) this.$listener = setup(this.toElement()); this.$listener.addEvent(key + ':namespace(' + this.$listener.guid + ')', value); this.toElement().addEvent(key + ':namespace(' + this.$listener.guid + ')', value); }.overloadSetter(), detach: function(key, value){ if (this.$listener){ if (typeof key == 'string') this.$listener.removeEvent(key + ':namespace(' + this.$listener.guid + ')', value); else this.$listener.removeEvents(key); } return this; }, toElement: function(){ return this.element; } }); }).call(this); // Implementation var MyClass = new Class({ Implements: [Listener, Class.Binds], initialize: function(){ this.element = new Element('div'); this.attach({ click: this.bound('onClick'), 'keyup:relay(:input)': this.bound('onKeyUp') }); } }); // Use var myInstance = new MyClass(); myInstance.detach();