Source: backbone-x/source/static.js

(function () {
  'use strict';

  /**
   * @class XM.StaticCollection
   * A collection whose values do not change.
   */
  XM.StaticCollection = Backbone.Collection.extend({ }, {
    _disabled: [ 'sync', 'fetch', 'trigger', 'shift', 'pop', 'set', 'slice' ],
    _noop: function (f) {
      return function () {
        console.warn('function [' + f + '] disabled on XM.StaticCollection');
      };
    }
  });
  XM.StaticCollection = XM.StaticCollection.extend(
    _.object(XM.StaticCollection._disabled, _.map(
      _.range(XM.StaticCollection._disabled.length),
      XM.StaticCollection._noop
    ))
  );

  /**
   * @class XM.StaticModel
   */
  XM.StaticModel = Backbone.Model.extend(/** @lends XM.StaticModel# */{
    idAttribute: 'key',

    /**
     * TODO xyz #document and possibly #refactor
     * don't remember why this was necessary, but it looks like a hack -tjw
     */
    getStatus: function () {
      return XM.Model.READY_CLEAN;
    },

    /**
     * TODO #document and possibly #refactor @see xyz
     */
    getStatusString: function () {
      return "READY_CLEAN";
    },

    getValue: function (attr) {
      return this.get(attr);
    },

    /**
     * @override
     * Auto-generate labels for enum values
     */
    parse: function (data, options) {
      return {
        key: data.key,
        value: data.value,
        label: ('_' + data.value.toLowerCase().camelize()).loc()
      };
    }
  });

  /**
   * @class XM.EnumMapCollection
   * @extends XM.StaticCollection
   * Convenience class for wrapping an enum in a Backbone Collection
   */
  XM.EnumMapCollection = XM.StaticCollection.extend({
    model: XM.StaticModel,
    constructor: function (attrs, options) {
      Backbone.Collection.call(this, attrs, _.extend({ parse: true }, options));
    },
    parse: function (data) {
      return _.map(data, function (value, key) {
        return { value: value, key: key };
      });
    }
  });

})();