text: /**
   * dat-gui JavaScript Controller Library
   * http://code.google.com/p/dat-gui
   *
   * Copyright 2011 Data Arts Team, Google Creative Lab
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   */
  
  define([
     'dat/utils/common'
  ], function(common) {
  
    /**
     * @class An "abstract" class that represents a given property of an object.
     *
     * @param {Object} object The object to be manipulated
     * @param {string} property The name of the property to be manipulated
     *
     * @member dat.controllers
     */
    var Controller = function(object, property) {
  
      this.initialValue = object[property];
  
      /**
       * Those who extend this class will put their DOM elements in here.
       * @type {DOMElement}
       */
      this.domElement = document.createElement('div');
  
      /**
       * The object to manipulate
       * @type {Object}
       */
      this.object = object;
  
      /**
       * The name of the property to manipulate
       * @type {String}
       */
      this.property = property;
  
      /**
       * The function to be called on change.
       * @type {Function}
       * @ignore
       */
      this.__onChange = undefined;
  
      /**
       * The function to be called on finishing change.
       * @type {Function}
       * @ignore
       */
      this.__onFinishChange = undefined;
  
    };
  
    common.extend(
  
        Controller.prototype,
  
        /** @lends dat.controllers.Controller.prototype */
        {
  
          /**
           * Specify that a function fire every time someone changes the value with
           * this Controller.
           *
           * @param {Function} fnc This function will be called whenever the value
           * is modified via this Controller.
           * @returns {dat.controllers.Controller} this
           */
          onChange: function(fnc) {
            this.__onChange = fnc;
            return this;
          },
  
          /**
           * Specify that a function fire every time someone "finishes" changing
           * the value wih this Controller. Useful for values that change
           * incrementally like numbers or strings.
           *
           * @param {Function} fnc This function will be called whenever
           * someone "finishes" changing the value via this Controller.
           * @returns {dat.controllers.Controller} this
           */
          onFinishChange: function(fnc) {
            this.__onFinishChange = fnc;
            return this;
          },
  
          /**
           * Change the value of <code>object[property]</code>
           *
           * @param {Object} newValue The new value of <code>object[property]</code>
           */
          setValue: function(newValue) {
            this.object[this.property] = newValue;
            if (this.__onChange) {
              this.__onChange.call(this, newValue);
            }
            this.updateDisplay();
            return this;
          },
  
          /**
           * Gets the value of <code>object[property]</code>
           *
           * @returns {Object} The current value of <code>object[property]</code>
           */
          getValue: function() {
            return this.object[this.property];
          },
  
          /**
           * Refreshes the visual display of a Controller in order to keep sync
           * with the object's current value.
           * @returns {dat.controllers.Controller} this
           */
          updateDisplay: function() {
            return this;
          },
  
          /**
           * @returns {Boolean} true if the value has deviated from initialValue
           */
          isModified: function() {
            return this.initialValue !== this.getValue()
          }
  
        }
  
    );
  
    return Controller;
  
  
  });