docs: function ImmutableAI (args) {
      // object that will store the state of the call which must be constructed
      // through multiple proxied property gets
      var call = {
          session: args.session,
      }
      // the proxy object must be addressed first as a property get in order
      // to set the namespace, module, and method to be called and then
      // called as a function to call that method
      var proxyFunctionWrapper = function proxyFunctionWrapper (args) {
          // make call
          return proxyFunction(call, args)
      }
      // create proxy for the proxy function object that will intercept each
      // property access on that object
      call.proxy = new Proxy(proxyFunctionWrapper, {
          // call the get proxy handler with the current call state
          get: function getProxyWrapper (target, property) {
              return getProxy(call, property)
          },
          // call the set proxy handler with the current call state
          set: function setProxyWrapper (target, property, value) {
              return setProxy(call, property, value)
          },
      })
      // return proxied function object
      return call.proxy
  }