function createPluginFactory(name, PluginSubClass) {

  // Add a `name` property to the plugin prototype so that each plugin can
  // refer to itself by name.
  PluginSubClass.prototype.name = name;

  return function () {
    triggerSetupEvent(this, { name: name, plugin: PluginSubClass, instance: null }, true);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    var instance = new (Function.prototype.bind.apply(PluginSubClass, [null].concat([this].concat(args))))();

    // The plugin is replaced by a function that returns the current instance.
    this[name] = function () {
      return instance;
    };

    triggerSetupEvent(this, instance.getEventHash());

    return instance;
  };
}
function createPluginFactory(name, PluginSubClass) {

  
  
  PluginSubClass.prototype.name = name;

  return function () {
    triggerSetupEvent(this, { name: name, plugin: PluginSubClass, instance: null }, true);

    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    var instance = new (Function.prototype.bind.apply(PluginSubClass, [null].concat([this].concat(args))))();

    
    this[name] = function () {
      return instance;
    };

    triggerSetupEvent(this, instance.getEventHash());

    return instance;
  };
}
function createPluginFactory ( name , PluginSubClass ) { // Add a `name` property to the plugin prototype so that each plugin can // refer to itself by name. PluginSubClass . prototype . name = name ; return function ( ) { triggerSetupEvent ( this , { name : name , plugin : PluginSubClass , instance : null } , true ) ; for ( var _len = arguments . length , args = Array ( _len ) , _key = 0 ; _key < _len ; _key ++ ) { args [ _key ] = arguments [ _key ] ; } var instance = new ( Function . prototype . bind . apply ( PluginSubClass , [ null ] . concat ( [ this ] . concat ( args ) ) ) ) ( ) ; // The plugin is replaced by a function that returns the current instance. this [ name ] = function ( ) { return instance ; } ; triggerSetupEvent ( this , instance . getEventHash ( ) ) ; return instance ; } ; }
Takes a plugin sub-class and returns a factory function for generating
instances of it.

This factory function will replace itself with an instance of the requested
sub-class of Plugin.

@private
@param   {string} name
The name of the plugin.

@param   {Plugin} PluginSubClass
The advanced plugin.

@returns {Function}
Takes a plugin sub - class and returns a factory function for generating instances of it .