2014-01-03 10:32:13 -08:00
# Template for classes with common functions, like hooking into the Mediator.
utils = require ' ./utils '
classCount = 0
makeScopeName = -> " class-scope- #{ classCount ++ } "
module.exports = class CocoClass
subscriptions: { }
shortcuts: { }
2014-02-15 17:29:54 -08:00
2014-01-03 10:32:13 -08:00
# setup/teardown
constructor: ->
@subscriptions = utils . combineAncestralObject ( @ , ' subscriptions ' )
@shortcuts = utils . combineAncestralObject ( @ , ' shortcuts ' )
@ listenToSubscriptions ( )
@scope = makeScopeName ( )
@ listenToShortcuts ( )
_ . extend ( @ , Backbone . Events ) if Backbone ?
destroy: ->
# teardown subscriptions, prevent new ones
@ stopListening ? ( )
2014-03-07 12:15:16 -08:00
@ off ( )
2014-01-03 10:32:13 -08:00
@ unsubscribeAll ( )
@ stopListeningToShortcuts ( )
2014-02-14 13:31:26 -08:00
@ [ key ] = undefined for key of @
@destroyed = true
@destroy = ->
2014-01-03 10:32:13 -08:00
# subscriptions
2014-02-15 17:29:54 -08:00
2014-01-03 10:32:13 -08:00
listenToSubscriptions: ->
# for initting subscriptions
return unless Backbone ? . Mediator ?
for channel , func of @ subscriptions
func = utils . normalizeFunc ( func , @ )
Backbone . Mediator . subscribe ( channel , func , @ )
addNewSubscription: (channel, func) ->
# this is for adding subscriptions on the fly, rather than at init
return unless Backbone ? . Mediator ?
return if @ destroyed
return unless @ subscriptions [ channel ] is undefined
func = utils . normalizeFunc ( func , @ )
@ subscriptions [ channel ] = func
Backbone . Mediator . subscribe ( channel , func , @ )
unsubscribeAll: ->
for channel , func of @ subscriptions
func = utils . normalizeFunc ( func , @ )
Backbone . Mediator . unsubscribe ( channel , func , @ )
2014-02-15 17:29:54 -08:00
2014-01-03 10:32:13 -08:00
# keymaster shortcuts
listenToShortcuts: ->
return unless key ?
for shortcut , func of @ shortcuts
func = utils . normalizeFunc ( func , @ )
key ( shortcut , @ scope , _ . bind ( func , @ ) )
2014-02-15 17:29:54 -08:00
2014-01-03 10:32:13 -08:00
stopListeningToShortcuts: ->
return unless key ?
2014-02-15 17:29:54 -08:00
key . deleteScope ( @ scope )