docs: function getProxy (call, property) {
      // use property name to set namespace
      if (call.namespace === undefined) {
          // return session if requested
          if (property === 'session') {
              return call.session
          }
          // return data if in module context
          else if (property === 'data') {
              // reset call on property get
              call = resetCall(call)
              // get module name from session
              var moduleName = getModuleName(call.session)
              // require module name
              assert.ok(defined(moduleName), `ImmutableAI cannot get data without session module context`)
              // return data if any
              return GLOBAL.immutableCore.getData(moduleName)
          }
          // require valid namespace
          assert.ok(property === 'http' || GLOBAL.localNamespaces[property] !== undefined, `ImmutableAI invalid namespace ${property}`)
          // set namespace
          call.namespace = property
      }
      // use property name to set module name
      else if (call.module === undefined) {
          call.module = property
          // call is for model
          if (call.namespace === 'model') {
              return newLocalModel(call)
          }
          // call is for http client
          else if (call.namespace === 'http') {
              return newHttpRequest(call)
          }
      }
      // use property name to set method name
      else if (call.method === undefined) {
          // if property is data then get data
          if (property === 'data') {
              // reset call on property get
              call = resetCall(call)
              // get full module name
              var moduleName = call.module+GLOBAL.localNamespaces[call.namespace]
              // return data if any
              return GLOBAL.immutableCore.getData(moduleName)
          }
          // if namespace is component create new component instance
          else if (call.namespace === 'component') {
              // property must be new
              assert.ok(property === 'new', `invalid method ${property} for component ${call.module}`)
              // create new component
              return newComponent(call)
          }
          // if namespace is task create new task instance
          else if (call.namespace === 'task') {
              // property must be new
              assert.ok(property === 'new', `invalid method ${property} for task ${call.module}`)
              // create new task
              return newTask(call)
          }
          // otherwise property should be method name to call
          else {
              call.method = property
          }
      }
      // if all properties set this is error
      else {
          throw new Error(`ImmutableAI property accessed with namespace, module, and method set: ${property}, ${call.namespace}, ${call.module}, ${call.method}`)
      }
      // return proxy to either set next property or call method
      return call.proxy
  }