Skip to content

Instantly share code, notes, and snippets.

@sheenobu
Last active December 14, 2015 15:38
Show Gist options
  • Select an option

  • Save sheenobu/5109003 to your computer and use it in GitHub Desktop.

Select an option

Save sheenobu/5109003 to your computer and use it in GitHub Desktop.
Dynamic and chainable read only models in coffee-script.
extend = (object, properties) ->
for key, val of properties
object[key] = val
object
merge = (options, overrides) ->
extend (extend {}, options), overrides
class Model
field: (name) ->
@fields ?= []
@fields.push(name)
@constructor::[name] = () ->
if arguments.length == 0
@attributes[name]
else
a = {}
a[name] = arguments[0]
a = merge(@attributes,a)
return new @constructor(a)
class Task2 extends Model
constructor: (@attributes) ->
@field "desc"
class Task3 extends Model
constructor: (@attributes) ->
@field "desc3"
t = new Task2("desc":"ASDFG")
t2 = t
console.log(t.desc(), t.desc() == t2.desc())
console.log(t.desc(), t.desc() == "ASDFG")
t3 = t.desc("ASDF")
console.log(t2.desc(), t2.desc() == "ASDFG")
console.log(t.desc(), t.desc() == "ASDFG")
console.log(t3.desc(), t3.desc() == "ASDF")
tx = new Task3("desc3":"X")
console.log(t2.desc(), t2.desc() == "ASDFG")
console.log(t.desc(), t.desc() == "ASDFG")
console.log(t3.desc(), t3.desc() == "ASDF")
console.log(tx.desc3(), tx.desc3() == "X")
console.log(tx.desc, tx.desc == undefined)
console.log(t2.desc3, t2.desc3 == undefined)
console.log(t.desc3, t.desc3 == undefined)
console.log(t3.desc3, t3.desc3 == undefined)
ASDFG true
ASDFG true
ASDFG true
ASDFG true
ASDF true
ASDFG true
ASDFG true
ASDF true
X true
undefined true
undefined true
undefined true
undefined true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment