docs: function getValidArgs (args, bindSignature, bindType, methodMeta) {
      // require object for args
      if (!args || typeof args !== 'object') {
          // throw exception in strict mode
          if (methodMeta.strictArgs) {
              return Promise.reject(new Error(`${methodMeta.signature}: invalid args - ${typeof args}`))
          }
          // otherwise create new object for args
          else {
              args = {}
          }
      }
      // require session
      if (!args.session || typeof args.session !== 'object') {
          // throw exception in strict mode
          if (methodMeta.strictArgs) {
              return Promise.reject(new Error(`${methodMeta.signature}: invalid session - ${typeof args.session}`))
          }
          // otherwise create new object for args
          else {
              args.session = {}
          }
      }
      // shallow clone args
      args = _.clone(args)
      // shallow clone session so that multiple async calls do not overwrite values
      args.session = _.clone(args.session)
      // create stack if it does not exist
      if (!args.session.stack) {
          args.session.stack = []
      }
      // otherwise clone stack
      else {
          args.session.stack = _.clone(args.session.stack)
      }
      // generate random unique id
      var uniqueId = randomUniqueId()
      // store module call id and timestamp on session for db and http logging
      args.session.moduleCallCreateTime = uniqueId.timestamp
      args.session.moduleCallId = uniqueId.id
      args.session.moduleCallSignature = methodMeta.signature
      // resolve any promises in args - do not resolve on bound methods because
      // args will already be resolved by primary method call
      if (methodMeta.resolve && !defined(bindType)) {
          return deepResolve(args)
      }
      // return valid args
      else {
          return Promise.resolve(args)
      }
  }