docs: function runNotCached (args, methodMeta) {
      // freeze args
      if (methodMeta.freeze) {
          // clone args to prevent leaking frozen objects
          args = _.cloneDeep(args)
          // recursively freeeze all objects in args
          deepFreeze(args)
      }
      // promise to be resolved with method result
      var promise
      // Immutable AI enabled
      if (methodMeta.immutableAI) {
          // create immutable ai instance
          var ai = immutableAI(args)
          // call method with Immutable AI instance
          promise = Promise.resolve( methodMeta.method.call(ai, args) )
      }
      // Immutable AI disabled
      else {
          promise = Promise.resolve( (methodMeta.method)(args) )
      }
      // args are frozen
      if (methodMeta.freeze) {
          // after result resolves clone to prevent leaking frozen objects
          promise = promise.then(_.cloneDeep)
      }
      // resolve promises
      if (methodMeta.resolve) {
          promise = promise.then(
              // if result is object then resolve promises
              ret => typeof ret === 'object' && ret !== null ? deepResolve(ret) : ret
          )
      }
      // validate return value
      if (defined(methodMeta.schema.return) && methodMeta.validateArgs) {
          promise = promise.then(ret => validateReturn(ret, methodMeta))
      }
      // return promise to be resolved with method result
      return promise
  }