code: function (config) {
              logger.debug("Applying config to new plugin: ", config && (config.name || config.type));
              util.mixin(this, config);
          }
docs: Plugins accept a config object with the following known properties:
  
  @param config
  name - (optional if plugin is never removed) unique name of the plugin for adding/removing from services
  type - (required) type of plugin, indicating where it is applied.
  Valid types are "read", "write", "url", "request", "response", "mixin", "provider", "progress" and "handler"
  fn - (required) the function to execute for plugin calls, e.g. the actual plugin.
  scope - (optional) the scope to execute the plugin function with, if absent the plugin is executed with the plugin as its scope.
  stopProcessing - (optional) boolean specifying whether or not this plugin should override more general plugins. Default is false.
  pointcut - (optional) "regex" string of the service/method the plugin applies to. E.g., *.* is global, *.read* is all methods
  prefixed with "read" on all services. Note this is not quite JS regexp format - it emulates AOP pointcut syntax for simplicity.
  Default is "*.*".
  
  See the circuits.PluginMatcher class for more information
  pattern - (optional) a full JS regular expression that will be matched against a string of the form: "ServiceName.ServiceMethod".
  See the circuits.PluginMatcher class for more information
  statusPattern - (optional)
  
  The above properties are required in order to create a functional plugin. Additional properties can also be
  specified in the config arg, and these can be used during function execution. They should not be named the same as the above
  required properties, of course.