jmdobry/reheat

View on GitHub
lib/collection/index.js

Summary

Maintainability
B
4 hrs
Test Coverage
module.exports = function (container, utils, errors, Collection_prototype, Collection_findAll, Collection_getAll) {

  /**
   * @doc function
   * @name Collection
   * @description
   * If a model instance represents a row in table, then a collection instance represents a whole table, or a
   * subset of the rows of a table, or some set of rows that are somehow related.
   *
   * The `Collection` "class" works much like a [Backbone.js Collection](http://backbonejs.org/#Collection), providing
   * a useful wrapper around an array of instances of your model classes.
   *
   * ## Signature:
   * ```js
   * new Collection([models]);
   * ```
   *
   * ## Example:
   *
   * ```js
   *  var reheat = require('reheat'),
   *      Post = require('../models/Post');
   *
   *  var Posts = reheat.defineCollection('Posts', {
     *      model: Post
     *  });
   *
   *  // All prototype properties and methods will be available on instances of Post.
   *  var posts = new Posts([
   *      {
     *          author: 'John Anderson',
     *          title: 'How NOT to cook'
     *      },
   *      {
     *          author: 'Sally Johnson',
     *          title: 'How to cook'
     *      }
   *  ]);
   * ```
   *
   * See [reheat.defineCollection](/documentation/api/api/reheat.defineCollection).
   */
  function Collection(models, options) {

    if (utils.isObject(models)) {
      if (!options) {
        options = models;
        models = [];
      } else {
        throw new errors.IllegalArgumentError('new Collection([models][, options]): models: Must be an array!', { actual: typeof models, expected: 'array' });
      }
    } else if (models && !utils.isArray(models)) {
      throw new errors.IllegalArgumentError('new Collection([models][, options]): models: Must be an array!', { actual: typeof models, expected: 'array' });
    } else if (options && !utils.isObject(options)) {
      throw new errors.IllegalArgumentError('new Collection([models][, options]): options: Must be an object!', { actual: typeof options, expected: 'object' });
    }
    options = options || {};

    this.models = [];
    this.index = {};

    this.initialize.apply(this, arguments);

    if (models) {
      this.reset.apply(this, [models]);
    }
  }

  // Mix in prototype methods and properties
  utils.deepMixIn(Collection.prototype, Collection_prototype);

  /**
   * @doc property
   * @id Collection.static_properties:model
   * @name model
   * @description
   * Model that this Collection should use.
   */
  Collection.model = null;

  Collection.findAll = Collection_findAll;
  Collection.filter = function () {
    console.warn('Collection#filter is deprecated! Please use Collection#findAll.');
    var args = Array.prototype.slice(arguments);
    return this.findAll.apply(this, args);
  };
  Collection.getAll = Collection_getAll;

  return Collection;
};