Created
November 13, 2011 14:19
-
-
Save robotlolita/1362156 to your computer and use it in GitHub Desktop.
indentation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//// Object Ekho | |
var Ekho = Base.clone({ | |
__init__: | |
function _init(parent, thing) { | |
this.listeners = { } | |
this.base = thing | |
this.parent = parent | |
return this }, | |
listeners: | |
function listeners(event) { | |
return this.listeners[event] | |
|| (this.listeners[event] = []) }, | |
listen: | |
function listen(event, handler, filter) { | |
handler = make_handler(handler, filter, []) | |
this.listeners(event).push(handler) | |
return handler }, | |
tap: | |
function tap(origin, method, handler, filter) { | |
handler = make_handler(handler, filter, []) | |
origin[method].listen? origin[method].listen('*call*', handler) | |
: /* plain function? */ origin[method] = make_ekho(wrapper, this) | |
return handler | |
function wrapper() { | |
result = origin[method].apply(origin, arguments) | |
wrapper.shout.apply(wrapper, ['*call*'].concat(result)) | |
return result }}, | |
once: | |
function once(handler) { var real_fn | |
real_fn = handler.fn | |
handler.fn = function(event) { | |
real_fn.apply(this, arguments) | |
return DROP } | |
return handler }, | |
deafen: | |
function deafen(event, handler) { var self | |
self = this | |
event? this.listeners[event] = filter() | |
: each(this.listeners, clean) | |
return this | |
function keepp(hd) { return handler && handler !== hd } | |
function filter() { return self.listeners(event).filter(keepp) } | |
function clean(ev) { return self.deafen(ev, handler) }}, | |
shout: | |
function shout(event) { | |
args = slice.call(arguments, 1) | |
event = make_event(this, event, args) | |
args.unshift(event) | |
this.listeners[event.type] = filter(this.listeners(event.type)) | |
if (!event.handled) event.bubble() | |
return this | |
function keepp(value) { return value !== DROP } | |
function filter(hooks){ var result | |
result = [] | |
hooks.every(function(hd) { | |
if (keepp(hd.exec.apply(hd, args))) result.push(hd) | |
return !event.halted }) | |
return result }} | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment