docs: function(o, fields, callback) {
      
      var single, self = this;
      
      if (callback == null) {
        callback = fields;
        fields = null;
      } else if (fields instanceof Array) {
        if (fields.indexOf('id') === -1) {
          fields.unshift('id'); // Ensure ID is included in query
        }
        fields = fields.join(', ');
      }
      
      if (typeof o == 'number') { 
        
        // If `o` is number: Convert to object
        o = {id: o};
  
      } else if (util.isArray(o)) {
        
        // If `o` is an array of params, process args recursively using multi
        var arr = o;
        var multi = this.multi();
        
        for (var i=0; i < arr.length; i++) {
          multi.get(arr[i], fields);
        }
        
        return multi.exec(function(err, results) {
          results = results.filter(function(val) {
            return val; // Filter null values
          });
          callback.call(self, err, results);
        });
        
      } else if (typeof o == 'object') {
        
        // IF `o` is object: Validate without checking required fields
        this.propertyCheck(o);
        
      } else {
        
        return callback.call(self, new Error(util.format("%s: Wrong value for `o` argument", this.className)), null);
        
      }
      
      // Set single if ID is specified in query
      if (o.id) single = true;
      
      // Prepare custom query
      var condition, key, value;
      var keys = [], values = [];
      
      for (key in o) {
        keys.push(key);
        values.push(o[key]);
      }
      
      // Prevent empty args
      if (keys.length === 0) {
        return callback.call(self, new Error(util.format("%s: Empty arguments", this.className)));
      } else {
        var len;
        condition = [];
        for (i=0,len=keys.length; i < len; i++) {
          condition.push(util.format('%s=$%d', keys[i], (i+1)));
        }
        condition = condition.join(' AND ');
      }
      
      // Get model data & return generated model (if found)
      this.driver.queryWhere({
        condition: condition,
        columns: fields || undefined,
        params: values,
        table: this.context,
        appendSql: "ORDER BY id DESC"
      }, function(err, results) {
        if (err) {
          callback.call(self, err, null);
        } else {
          if (results.length === 0) {
            callback.call(self, null, single ? null : []);
          } else if (single) {
            callback.call(self, null, self.createModel(results[0]));
          } else {
            for (var models=[],i=0; i < results.length; i++) {
              models.push(self.createModel(results[i]));
            }
            callback.call(self, null, models);
          }
        }
      });
    }