docs: function createModelObject() {
    var key, method,
        self = this,
        generator = this;
    
    /**
      Model Object Class. Generated by the Model.
    
      @private
      @class ModelObject
      @constructor
     */
    
    function ModelObject() {
      this.className = generator.className + 'Object';
    }
    
    /**
      Model Generator
     */
  
    ModelObject.prototype.generator = this;
    
    var gen = this;
    
    
    /**
      Get Changed Values
  
      @returns {object} Object with the fields updated
     */
   
    ModelObject.prototype.getUpdatedFields = function() {
      var diff = 0,
          update = {},
          currentState = gen.createCurrentState(this),
          origState = this.__currentState;
      for (var key in currentState) {
        if (currentState[key] !== origState[key]) {
          update[key] = currentState[key];
          diff++;
        }
      }
      return (diff > 0) ? update : null;
    }
    
    /**
      Save model data
    
      Provides [err]
    
      @param {function} callback
     */
    
    ModelObject.prototype.save = function(callback) {
      
      var self = this;
      
      // Emit before_save event
      generator.emit('before_save', self);
      
      // Get updated fields after the before_save event
      var update = this.getUpdatedFields();
      
      // No changes
      if (update == null) { 
        callback.call(self, null); 
        return; 
      }
      
      update.id = this.id;
      
      // Perform driver save.
      // NOTE: data is validated by the model
      generator.save(update, function(err) {
        generator.emit('after_save', err, self);
        callback.call(self, err);
      });
    }
    
    /**
      Alias of `ModelObject::save`
    
      @method update
     */
    
    ModelObject.prototype.update = ModelObject.prototype.save; // alias
    
    /**
      Alias of `ModelObject::save`
     */
  
    ModelObject.prototype.sync = ModelObject.prototype.save; // alias
    
    /**
      Delete model data
    
      Provides: [err]
    
      @param {function} callback
     */
    
    ModelObject.prototype.delete = function(callback) {
      var self = this;
      var generator = this.generator;
      generator.delete(this.id, function(err) {
        generator.emit('delete', err, self);
        callback.call(self, err);
      });
    }
    
    /**
      Alias of `ModelObject::delete`
     */
    
    ModelObject.prototype.remove = ModelObject.prototype.delete; // alias
    
    /**
      Alias of `ModelObject::delete`
     */
   
    ModelObject.prototype.destroy = ModelObject.prototype.delete; // alias
  
    /**
      Creates a Multi object
    
      @private
      @param {object} options Multi Configuration
     */
    
    ModelObject.prototype.createMulti = function(options) {
      return new Multi(this, options);
    }
    
    /**
      Provides caching capabilities. Alias of `Driver::queryCached`
     */
   
    ModelObject.prototype.queryCached = function(cdata) {
      var args = slice.call(arguments, 0),
          driver = this.generator.driver;
      cdata.storage = driver.storage;
      driver.queryCached.apply(this, args);
    }
    
    return ModelObject;
    
  }