code: function callNextPlugin (plugins, methodName, args) {
    var result, error, nextCalled;
    var plugin = plugins.shift();
  
    if (!plugin) {
      // We've reached the end of the plugin chain. No plugin returned a value.
      return { plugin: null, result: undefined };
    }
  
    // Invoke the plugin method. It can return a value, throw an error, or call next()
    args.next = next;
    result = plugin[methodName].call(null, args);
  
    if (result !== undefined && nextCalled) {
      throw ono('Error in %s.%s: Cannot return a value and call next()', plugin.name, methodName);
    }
  
    if (error) {
      throw ono(error, 'Error in %s.%s:', plugin.name, methodName);
    }
    else if (nextCalled && result === undefined) {
      return callNextPlugin(plugins, methodName, args);
    }
    else {
      // next() was NOT called, so return the plugin's result (even if there was no return value)
      return { plugin: plugin, result: result };
    }
  
    function next (err, value) {
      if (nextCalled) {
        error = ono('Error in %s.%s: next() was called multiple times', plugin.name, methodName);
      }
  
      nextCalled = true;
      error = err;
      result = value;
    }
  }
docs: Calls the the next plugin from an array of plugins.
  
  @param {object[]} plugins - The array of plugins
  @param {string} methodName - The name of the plugin method to call
  @param {object} args - The arguments to pass to the method
  @returns {{ plugin: ?object, result: * }}