Skip to content

drabiter/caphe

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Caphe

Build Status Coverage Status NPM Download

NPM

Various design utils for htpp://coffeescript.org. Implementation of Reg Braithwaite's article.

Features

> mixin consumer, modules...

Mix modules' methods to the model.

class Person

person = new Person()

Talkable =
  speak: ->
    console.log "Yeah!"

Moveable =
  walk: (speed) ->
    console.log "Walk by #{speed}"
  run: (speed) ->
    console.log "Run by #{speed}"

Caphe.mixin(person, Talkable, Moveable)


person.speak() # "Yeah!"
person.walk(8) # "Walk by 8"
person.run(5)  # "Run by 5"

> include module[, names...]

Like mixin but do it Ruby style. Optionally, specify name of methods that will be included

Talkable =
  speak: ->
    console.log "Yeah!"

class Person extends Caphe
  @include Talkable
  @include Moveable, 'run'

person = new Person()


person.speak() # "Yeah!"
person.run(6)  # "Run by 6"

person.walk(4) # undefined

> attrAccessor names...

Create getter & setter methods in Ruby style and hide the properties from public access.

class Person extends Caphe
  @attrAccessor "name", "age"

  constructor: (@job) ->


person = new Person("Bar")
person.setName("Foo")
person.getName()        # Foo
person.name             # undefined
person.getAge()         # undefined
person.setAge(5)
person.getAge()         # 5
person.age              # undefined
person.job              # Bar

> CONST name: value, ...

Create constant getters in prototype level.

class Person extends Caphe
  @CONST EYE: 2, SPECIES: 'homo sapiens'


Person::EYE()      # 2
Person::SPECIES()  # homo sapiens

> forward consumer, providers...

Mixin with late bound. The forwarded methods have each own module as their context.

module.foo = -> console.log "a"
module.bar = -> console.log @name
Caphe.forward(person, module)


person.foo()  # a
person.bar()  # undefined

module.bar = -> console.log "b"
person.bar()  # b

> delegate consumer, providers...

Like #forward, but the forwarded methods have the consumer as their context.

person.name = "John"
module.foo = -> console.log "a"
module.bar = -> console.log @name
Caphe.delegate(person, module)


person.foo()  # a
person.bar()  # John

module.foo = -> console.log "b"
person.foo()  # b

Releases

No releases published

Packages

No packages published