docs: function bind (bindType, signature, method) {
      // validate signature
      signature = getValidSignature(signature)
      // require valid bind method
      if (typeof method !== 'function' || !defined(method.meta)) {
          throw new Error('invalid bind method')
      }
      // create bind entry for module if it does not exist
      if (!defined(immutable.binds[signature.moduleName])) {
          immutable.binds[signature.moduleName] = {}
      }
      var moduleBinds = immutable.binds[signature.moduleName]
      // create bind entry for method if it does not exist
      if (!defined(moduleBinds[signature.methodName])) {
          moduleBinds[signature.methodName] = {}
      }
      var methodBinds = moduleBinds[signature.methodName]
      // create bind entry for bind type if it does not exist
      if (!defined(methodBinds[bindType])) {
          methodBinds[bindType] = {}
      }
      var bindTypeBinds = methodBinds[bindType]
      // throw error on override
      if (defined(bindTypeBinds[method.meta.signature]) && !immutable.defaultAllowOverride) {
          throw new Error(`bind error: method ${method.meta.signature} already bound ${bindType} to ${signature.signature}`)
      }
      // add bind method entry
      bindTypeBinds[method.meta.signature] = {
          bound: false,
          method: method,
      }
      // bind to method if it exists
      doBindForMethod(signature.signature)
      // return immutable
      return ImmutableCore
  }