Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //// 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 }}
- })
Add Comment
Please, Sign In to add comment