-
Notifications
You must be signed in to change notification settings - Fork 0
dbrans/coffeeclass
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
# DSL for creating and extending classes and mixins in coffeescript
# Create a class
# Initialize properties on a per-instance basis using functions
# Here, every instance of A will have its own queue.
class A extends Class
@initialize
queue: Array # or -> []
map: Object # or -> {}
a1 = new A
a1.queue.push 'foo'
(new A).queue # empty
# Use @introduce when you intend to declare new keys
# Here, an exception is thrown since 'queue' was introduced in A
class B extends A
@introduce
queue: ->
bar: ->
# init method is called immediately after object construction with the arguments
# that were passed to the constructor:
class C extends B
init: (arg) ->
# Use @before and @after to do most of your method 'overriding'.
# The super (or whatever was at that key) is called for you, whether it exists or not.
class D extends C
@after init: (arg) ->
# Define a mixin
QueueMixin = ->
@initialize
queue: Array
@introduce push: (x) -> @queue.push x
# Extend a mixin
StackMixin = ->
@do QueueMixin
@introduce pop: -> @queue.pop()
OtherMixin = ->
class MyStack extends Class
@do StackMixin, OtherMixin #Apply mixins
# Other nice stuff: Properties, Delegation, Object.do
# Properties
class Point extends Class
@property
x:
get: -> @_x ?= 0
set: (@_x) ->
y:
get: -> @_y ?= 0
set: (@_y) ->
p = new Point
p.x() # -1
p.x 3
p.x() # 3
# Delegation
class Rect extends Class
@initialize
topleft: -> new Point
dim: -> new Point
@delegate x: 'topleft', y: 'topleft'
@delegate width: 'dim.x', height: 'dim.y'
# Object.do
# Descendents of Class implement 'do', a safe form of 'with'
r = new Rect
r.do ->
@x 3
@width 15
@dim.do ->
@y 15
About
DSL for creating classes and mixins for coffeescript
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published