-
-
Save joyrexus/6887526 to your computer and use it in GitHub Desktop.
CoffeeScript base class
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
class Base | |
### | |
Provides default options, mixins, and custom events. | |
### | |
defaults: {} | |
constructor: (options) -> | |
@setOptions options | |
setOptions: (options) -> | |
@options = merge {}, @defaults, options | |
this | |
on: (event, handler) -> | |
@_events ?= {} | |
(@_events[event] ?= []).push handler | |
this | |
off: (event, handler) -> | |
for suspect, index in @_events[event] when suspect is handler | |
@_events[event].splice index, 1 | |
this | |
trigger: (event, args...) -> | |
return this unless @_events[event]? | |
handler.apply this, args for handler in @_events[event] | |
this | |
@include = (objects...) -> | |
merge @prototype, objects... | |
this | |
# private helper | |
merge = (target, extensions...) -> | |
for extension in extensions | |
for own property of extension | |
target[property] = extension[property] | |
target |
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
# Test framework | |
testData = total: 0, passed: 0 | |
equal = (val, expected, message) -> | |
testData.total++ | |
if val is expected | |
testData.passed++ | |
console.log "ok #{message}" | |
else | |
console.log "not ok #{message}, expected #{val} to equal #{expected}" | |
report = -> | |
{total, passed} = testData | |
percent = (passed / total * 100).toFixed() | |
status = if passed is total then 'ok' else 'not ok' | |
console.log "\n#{status} #{passed}/#{total}, #{percent}%" | |
# Test suite | |
mixin = foo: -> 'foo' | |
mixin2 = bar: -> 'bar' | |
class Sub extends Base | |
@include mixin, mixin2 | |
defaults: | |
a: 1 | |
b: 2 | |
sub = new Sub b: 3, c: 4 | |
equal sub.options.a, Sub::defaults.a, | |
'set default options' | |
equal sub.options.b, 3, | |
'override defaults with instance options' | |
equal sub.options.c, 4, | |
'add instance options' | |
equal sub.foo(), mixin.foo(), | |
'include objects' | |
equal sub.bar(), mixin2.bar(), | |
'include multiple objects' | |
triggered = false | |
x = null | |
y = null | |
that = null | |
handler = (a, b) -> | |
triggered = true | |
x = a | |
y = b | |
that = this | |
sub.on 'some event', handler | |
sub.trigger 'some event', 1, 2 | |
equal triggered, true, | |
'triggered an event' | |
equal x, 1, | |
'sent first argument to event handler' | |
equal y, 2, | |
'sent second argument to event handler' | |
equal that, sub, | |
'set context of event handler to object' | |
x = 0 | |
sub.off 'some event', handler | |
sub.trigger 'some event' | |
equal x, 0, | |
'removed event handler' | |
a = false | |
b = false | |
sub.on 'multiple', -> a = true | |
sub.on 'multiple', -> b = true | |
sub.trigger 'multiple' | |
equal a, true, | |
'triggered one handler' | |
equal b, true, | |
'triggered two handlers' | |
report() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment