text: /**
   * Copyright 2013-2015, 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 ReactPerf
   * @typechecks static-only
   */
  
  'use strict';
  
  /**
   * ReactPerf is a general AOP system designed to measure performance. This
   * module only has the hooks: see ReactDefaultPerf for the analysis tool.
   */
  var ReactPerf = {
    /**
     * Boolean to enable/disable measurement. Set to false by default to prevent
     * accidental logging and perf loss.
     */
    enableMeasure: false,
  
    /**
     * Holds onto the measure function in use. By default, don't measure
     * anything, but we'll override this if we inject a measure function.
     */
    storedMeasure: _noMeasure,
  
    /**
     * @param {object} object
     * @param {string} objectName
     * @param {object<string>} methodNames
     */
    measureMethods: function(object, objectName, methodNames) {
      if (__DEV__) {
        for (var key in methodNames) {
          if (!methodNames.hasOwnProperty(key)) {
            continue;
          }
          object[key] = ReactPerf.measure(
            objectName,
            methodNames[key],
            object[key]
          );
        }
      }
    },
  
    /**
     * Use this to wrap methods you want to measure. Zero overhead in production.
     *
     * @param {string} objName
     * @param {string} fnName
     * @param {function} func
     * @return {function}
     */
    measure: function(objName, fnName, func) {
      if (__DEV__) {
        var measuredFunc = null;
        var wrapper = function() {
          if (ReactPerf.enableMeasure) {
            if (!measuredFunc) {
              measuredFunc = ReactPerf.storedMeasure(objName, fnName, func);
            }
            return measuredFunc.apply(this, arguments);
          }
          return func.apply(this, arguments);
        };
        wrapper.displayName = objName + '_' + fnName;
        return wrapper;
      }
      return func;
    },
  
    injection: {
      /**
       * @param {function} measure
       */
      injectMeasure: function(measure) {
        ReactPerf.storedMeasure = measure;
      },
    },
  };
  
  /**
   * Simply passes through the measured function, without measuring it.
   *
   * @param {string} objName
   * @param {string} fnName
   * @param {function} func
   * @return {function}
   */
  function _noMeasure(objName, fnName, func) {
    return func;
  }
  
  module.exports = ReactPerf;
  