    /* <CoffeeScript>
    class iCalculator
    </CoffeeScript> */
      /**
       * @class Lumenize.iCalculator
       *
       * This serves as documentation for the interface expected of all Lumenize Calculators. You can extend from it but it's
       * not technically necessary. You are more likely to copy this as the starting point for a new calculator.
       *
       * @constructor
       * @param {Object} config
       *   The config properties are up to you.
       */
    /* <CoffeeScript>

          The config properties are up to you.
        throw new Error('iCalculator is an interface not a base class. You must override this constructor.')

      addSnapshots: (snapshots, startOn, endBefore) ->
    </CoffeeScript> */
        /**
         * @method addSnapshots
         * @member Lumenize.iCalculator
         *   Allows you to incrementally add snapshots to this calculator.
         * @chainable
         * @param {Object[]} snapshots An array of temporal data model snapshots.
         * @param {String} startOn A ISOString (e.g. '2012-01-01T12:34:56.789Z') indicating the time start of the period of
         *   interest. On the second through nth call, this should equal the previous endBefore.
         * @param {String} endBefore A ISOString (e.g. '2012-01-01T12:34:56.789Z') indicating the moment just past the time
         *   period of interest.
         * @return {iCalculator}
         */
    /* <CoffeeScript>
        throw new Error('iCalculator is an interface not a base class. You must override this addSnapshots method.')

        # example code follows
        if @upToDateISOString?
          utils.assert(@upToDateISOString == startOn, "startOn (#{startOn}) parameter should equal endBefore of previous call (#{@upToDateISOString}) to addSnapshots.")
        @upToDateISOString = endBefore
        # Do what you need to do
        return this

      getResults: () ->
    </CoffeeScript> */
        /**
         * @method getResults
         * @member Lumenize.iCalculator
         *   Returns the current state of the calculator
         * @return {Object} The type and format of what it returns is up to you.
         */
    /* <CoffeeScript>
        throw new Error('iCalculator is an interface not a base class. You must override this getResults method.')

      getStateForSaving: (meta) ->
    </CoffeeScript> */
        /**
         * @method getStateForSaving
         * @member Lumenize.iCalculator
         *   Enables saving the state of this calculator. See TimeInStateCalculator for a detailed example.
         * @param {Object} [meta] An optional parameter that will be added to the serialized output and added to the meta field
         *   within the deserialized calculator.
         * @return {Object} Returns an Ojbect representing the state of the calculator. This Object is suitable for saving to
         *   to an object store or LocalCache. Use the static method `newFromSavedState()` with this Object as the parameter to reconstitute
         *   the calculator.
         */
    /* <CoffeeScript>
        throw new Error('iCalculator is an interface not a base class. You must override this getStateForSaving method.')

        # example code follows
        out = {}
        out.upToDateISOString = @upToDateISOString
        if meta?
          out.meta = meta
        # Add whatever you need to fully serialize the state of the calculator
        return out

      @newFromSavedState: (p) ->
    </CoffeeScript> */
        /**
         * @method newFromSavedState
         * @member Lumenize.iCalculator
         *   Deserializes a previously saved calculator and returns a new calculator. See TimeInStateCalculator for a detailed example.
         * @static
         * @param {String/Object} p A String or Object from a previously saved calculator state
         * @return {iCalculator}
         */
    /* <CoffeeScript>
        throw new Error('iCalculator is an interface not a base class. You must override this @newFromSavedState method.')

        # example code follows
        if utils.type(p) is 'string'
          p = JSON.parse(p)
        # calculator = new <your_class_here>(p.config)
        if p.meta?
          calculator.meta = p.meta
        # Other stuff to restore the calculator state
        calculator.upToDateISOString = p.upToDateISOString
        return calculator

    exports.iCalculator = iCalculator

    </CoffeeScript> */