bindable = require "bindable"
decor    = require "./decor"
protoclass = require "protoclass"

_cid = 0

class Model extends bindable.Object

  ###
  ###

  __isModel: true

  ###
  ###

  constructor: (data = {}) ->

    super {
      _cid: "model" + (_cid++)
    }
    
    if data 
      @reset data


    @__decorators = undefined
    decor.decorate @  


  ###
   deprecated
  ###

  reset: (data) => @update data

  ###
  ###

  update: (data) =>
    @setProperties @map data
    @isNew = !@get("_id")

  ###
   DEPRECATED
  ###

  map: (data) -> @deserialize data

  ###
  ###

  deserialize: (data) -> data

  ###
  ###

  serialize: () -> @context()

  ###
  ###

  decorate: (options) -> 
    decor.decorate @, options

  ###
  ###

  toJSON: () -> @serialize()



module.exports = protoclass.setup Model