text: /**
   * Copyright 2013-2014, Facebook, Inc.
   * All rights reserved.
   *
   * This source code is licensed under the BSD-style license found in the
   * LICENSE file in the root directory of this source tree. An additional grant
   * of patent rights can be found in the PATENTS file in the same directory.
   *
   * @providesModule ReactOwner
   */
  
  "use strict";
  
  var invariant = require("./invariant");
  
  /**
   * ReactOwners are capable of storing references to owned components.
   *
   * All components are capable of //being// referenced by owner components, but
   * only ReactOwner components are capable of //referencing// owned components.
   * The named reference is known as a "ref".
   *
   * Refs are available when mounted and updated during reconciliation.
   *
   *   var MyComponent = React.createClass({
   *     render: function() {
   *       return (
   *         <div onClick={this.handleClick}>
   *           <CustomComponent ref="custom" />
   *         </div>
   *       );
   *     },
   *     handleClick: function() {
   *       this.refs.custom.handleClick();
   *     },
   *     componentDidMount: function() {
   *       this.refs.custom.initialize();
   *     }
   *   });
   *
   * Refs should rarely be used. When refs are used, they should only be done to
   * control data that is not handled by React's data flow.
   *
   * @class ReactOwner
   */
  var ReactOwner = {
  
    /**
     * @param {?object} object
     * @return {boolean} True if `object` is a valid owner.
     * @final
     */
    isValidOwner: function(object) {
      return !!(
        object &&
        typeof object.attachRef === 'function' &&
        typeof object.detachRef === 'function'
      );
    },
  
    /**
     * Adds a component by ref to an owner component.
     *
     * @param {ReactComponent} component Component to reference.
     * @param {string} ref Name by which to refer to the component.
     * @param {ReactOwner} owner Component on which to record the ref.
     * @final
     * @internal
     */
    addComponentAsRefTo: function(component, ref, owner) {
      ("production" !== process.env.NODE_ENV ? invariant(
        ReactOwner.isValidOwner(owner),
        'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' +
        'usually means that you\'re trying to add a ref to a component that ' +
        'doesn\'t have an owner (that is, was not created inside of another ' +
        'component\'s `render` method). Try rendering this component inside of ' +
        'a new top-level component which will hold the ref.'
      ) : invariant(ReactOwner.isValidOwner(owner)));
      owner.attachRef(ref, component);
    },
  
    /**
     * Removes a component by ref from an owner component.
     *
     * @param {ReactComponent} component Component to dereference.
     * @param {string} ref Name of the ref to remove.
     * @param {ReactOwner} owner Component on which the ref is recorded.
     * @final
     * @internal
     */
    removeComponentAsRefFrom: function(component, ref, owner) {
      ("production" !== process.env.NODE_ENV ? invariant(
        ReactOwner.isValidOwner(owner),
        'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' +
        'usually means that you\'re trying to remove a ref to a component that ' +
        'doesn\'t have an owner (that is, was not created inside of another ' +
        'component\'s `render` method). Try rendering this component inside of ' +
        'a new top-level component which will hold the ref.'
      ) : invariant(ReactOwner.isValidOwner(owner)));
      // Check that `component` is still the current ref because we do not want to
      // detach the ref if another component stole it.
      if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) {
        owner.detachRef(ref);
      }
    }
  
  };
  
  module.exports = ReactOwner;
  