nylon

Nylon =====

Nylon

class Person extends Model
  @attr 'name':
    default: 'Anonymous'
    validate: (value) -> return false unless value # Required 
 
  @attr 'birthday':
    default: 0
    set: (value) -> Math.min value1900 + (new Date).getYear() # Clamp value 
 
class Book extends Model
  @attr 'title':
    default: 'Untitled'
 
  @attr 'publishedAt':
    default: 0
vonnegut = new Person name: 'Vonnegut'
vonnegut.set name: 'Kurt Vonnegut'birthday: 1922
# Imply a two-way relationship by defining both relationships together. 
Person.hasMany publications: Book
Book.belongsToOne author: Personas: 'publications'
catsCradle = new Book title: 'Cat’s Cradle'publishedAt: 1963
vonnegut.get('publications').add catsCradle
# catsCradle.get('author') is vonnegut 
class Bio extends View
  @model: Person # Model for this view 
 
  @template: '''
    <button class="delete">X</button>
    <div class="name"></div>
    <div class="pubs"></div>
  '''
 
  # Assign certain elements property names 
  @el '.name': name
  @el '.pubs': pubs
 
  # These "@render" methods fire when a "change" is triggered. 
 
  @render 'name': (value) ->
    @name.innerHTML = value
 
  @render 'publications': ->
    @pubs.innerHTML = @model.publicaions.count()
 
class BioEditor extends Controller
  @view: Bio # View for this controller 
 
  constructor: ->
    @el.setAttribute 'tabindex'0 # This controller can be focused. 
 
  @on 'click* .delete': 'deleteModel' # The "*" means prevent default. 
 
  @on 'keydown*:DELETE': 'deleteModel' # Keys can be passed on key events. 
 
  deleteModel: =>
    @model.destroy() # Automatically disconnects controller, removes view.