docs: function methodWrapperFunction (args, bindSignature, bindType) {
          // throw exception on invalid arguments
          if (methodMeta.strictArgs && arguments.length > 1 && !bindTypes[bindType]) {
              return Promise.reject(new Error(`${methodMeta.signature}: too many arguments`))
          }
          // get validated and shallow-cloned args with module call data added
          return getValidArgs(args, bindSignature, bindType, methodMeta)
          // run before methods
          .then(args => {
              // log module call
              logCall(args, methodMeta)
              // if this method is bound to another add info to stack
              var stack = bindTypes[bindType]
                  ? `${methodMeta.signature},${bindType},${bindSignature}`
                  : methodMeta.signature
              // add current call to stack after logging
              args.session.stack.push(stack)
              // run any beforeDetach extensions
              runBeforeDetach(args, methodMeta)
              // run any before extensions
              return runBefore(args, methodMeta)
          })
          // call target function with potentially modified args
          .then(args => {
              // validate args after before methods execute
              validateArgs(args, methodMeta)
              // run any withDetach extensions
              runWithDetach(args, methodMeta)
              // run any with extensions
              var runWith = runWithBefore(args, methodMeta)
              // get return value for method call with optional caching
              var ret = methodMeta.cache
                  // method call should be cached
                  ? runCached(args, methodMeta)
                  // method call should not be cached
                  : runNotCached(args, methodMeta)
              // if there are any with exensions merge them in
              if (defined(runWith)) {
                  ret = runWithAfter(ret, runWith)
              }
              // run any afterDetach extensions
              runAfterDetach(args, methodMeta, ret)
              // run any after extensions
              ret = runAfter(args, methodMeta, ret)
              // inject logger into promise chain
              ret = logReturn(args, methodMeta, ret)
              // resolve with promise chain
              return ret
          })
      }