text: /**
   * Copyright 2013-present, 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 ReactLink
   */
  
  'use strict';
  
  /**
   * ReactLink encapsulates a common pattern in which a component wants to modify
   * a prop received from its parent. ReactLink allows the parent to pass down a
   * value coupled with a callback that, when invoked, expresses an intent to
   * modify that value. For example:
   *
   * React.createClass({
   *   getInitialState: function() {
   *     return {value: ''};
   *   },
   *   render: function() {
   *     var valueLink = new ReactLink(this.state.value, this._handleValueChange);
   *     return <input valueLink={valueLink} />;
   *   },
   *   _handleValueChange: function(newValue) {
   *     this.setState({value: newValue});
   *   }
   * });
   *
   * We have provided some sugary mixins to make the creation and
   * consumption of ReactLink easier; see LinkedValueUtils and LinkedStateMixin.
   */
  
  var React = require('./React');
  
  /**
   * @param {*} value current value of the link
   * @param {function} requestChange callback to request a change
   */
  function ReactLink(value, requestChange) {
    this.value = value;
    this.requestChange = requestChange;
  }
  
  /**
   * Creates a PropType that enforces the ReactLink API and optionally checks the
   * type of the value being passed inside the link. Example:
   *
   * MyComponent.propTypes = {
   *   tabIndexLink: ReactLink.PropTypes.link(React.PropTypes.number)
   * }
   */
  function createLinkTypeChecker(linkType) {
    var shapes = {
      value: linkType === undefined ? React.PropTypes.any.isRequired : linkType.isRequired,
      requestChange: React.PropTypes.func.isRequired
    };
    return React.PropTypes.shape(shapes);
  }
  
  ReactLink.PropTypes = {
    link: createLinkTypeChecker
  };
  
  module.exports = ReactLink;