Skip to content

Instantly share code, notes, and snippets.

Created March 5, 2013 16:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/5091764 to your computer and use it in GitHub Desktop.
Save anonymous/5091764 to your computer and use it in GitHub Desktop.
_ = require 'lodash'
mixinEvents = (obj) ->
obj_destroy = obj.destroy
_.extend obj,
_listeners: {}
_listeningTo: []
on: (producer, pattern, callback) ->
@_listeningTo.push([producer, pattern, callback])
producer._bindListener(pattern, callback)
trigger: (pattern, data...) ->
(f(data...) for f in (@_listeners[pattern] or []))
destroy: ->
for [producer, pattern, callback] in @_listeningTo
producer._unbindListener(pattern, callback)
@_listeningTo = []
@_listeners = {}
obj_destroy?.apply(obj)
_bindListener: (pattern, callback) ->
for p in pattern.split(' ')
@_listeners[pattern] or= []
@_listeners[pattern].push(callback)
_unbindListener: (pattern, callback) ->
for p in pattern.split(' ')
continue unless @_listeners[pattern]
idx = @_listeners[pattern].indexOf(callback)
if idx != -1
@_listeners[pattern].splice(idx, 1)
module.exports = mixinEvents
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment