code: function Document(db, raw) 
  {
    var self = this, raw;
    if (raw===undefined) raw = { };
    if (typeof(raw)==="string") raw = deserialize(raw);
    
    Object.defineProperty(this, "save", { value: function(cb) {
      return db.save(self, cb);
    }, writable: false  });
  
    Object.defineProperty(this, "remove", { value: function(cb) {
      if (! self._id) return cb(); // TODO maybe emit error
      return db.remove({ _id: self._id }, { }, cb);
    }, writable: false  });
  
    Object.defineProperty(this, "update", { value: function(modifier, cb) {
      if (self._id === undefined) self._id = db.createNewId();
      return db.update({ _id: self._id }, modifier, { upsert: true }, cb);
    }, writable: false  });
  
    Object.defineProperty(this, "copy", { value: function(strict) { 
      return deepCopy(self, strict);
    }, writable: false });
  
    Object.defineProperty(this, "serialize", { value: function(strict) {
      return serialize(self);
    }, writable: false });
  
    // Special methods
    for (var method in db._methods) Object.defineProperty(this, method, { value: db._methods[method], writable: false });
  
    // Persist to LevelUP
    Object.defineProperty(this, "_persist", { value: function(cb, quiet) {
      if (!quiet) db.emit("save", self);
      db.store.put(self._id, self.serialize(), function(err) {
        cb(err || null, err ? undefined : self);  
      });
    } });
  
    _.extend(this, raw.constructor.modelName ? deepCopy(raw) : raw); // Clone it deeply if it's schema-constructed
    schemas.construct(this, db.schema);
    db.emit("construct", self);
  }
docs: /*
  Instance of a model (Document)
  Low level functions here (_persist), we use them in our higher-levels (Model.update, Model.remove)