code: function runBefore (args, methodMeta) {
      // resolve with original args if no before extensions
      if (!defined(methodMeta.before)) {
          return Promise.resolve(args)
      }
      // wait for all extension methods to complete
      return Promise.all(
          // run all before methods in order making sure they return promise
          _.map(methodMeta.before, method => {
              return (method)(args, methodMeta.signature, 'before')
          })
      )
      // merge return values in args
      .then(results => {
          // merge each result into original args
          _.each(results, result => {
              if (typeof result === 'object' && result !== null) {
                  _.merge(args, result)
              }
          })
          // resolve with merged result
          return args
      })
  }
docs: @function runBefore
  
  run extension methods bound on before. if any of these methods reject the
  parent method call will reject. any return values from before methods are
  merged into the original args before calling the parent method.
  
  @param {object} args
  @param {object} methodMeta
  
  @returns {Promise}