docs: function(schema, obj, typedSchema, options) {
    if (!(this instanceof Model))
      return new Model(schema, obj);
  
    this.options = options || {};
    this.self = Model;
    this.parent = this.options.parent;
  
    if(!typedSchema) {
      var schemas = Model._parseSchema(schema);
      this.typedSchema = schemas.typed;
      this.schema = schemas.normalized;
    } else {
      this.schema = schema;
      this.typedSchema = typedSchema;
    }
    
    //instantiate and initialize the data
    this.data = this._instantiateSchema(this.schema, this.typedSchema);
    
    //define properties
    //TODO make this optional?
    for(var prop in this.data) {
      if(this.data.hasOwnProperty(prop)) {
        Model._defineProperty(this, this, prop);
      }
    }
  
    this.set(obj);
  
    if(!this.options.doNotSetDefaults) {
      this.setDefault();
    }
  }