docs: function bind (bindType, methodName, bindMethod) {
      // require valid name
      requireValidName(methodName)
      // get method
      var method = this[methodName]
      // require method
      this.assert(defined(method), `method name ${methodName} not defined`)
      // require valid bind type
      this.assert(defined(bindTypes[bindType]), `invalid bind type ${bindType}`)
      // require valid bind method
      this.assert(typeof bindMethod === 'function' && defined(bindMethod.meta), 'invalid bind method')
      // get immutable global data store
      var immutable = global.__immutable_core__
      // require immutable global to exist
      this.assert(defined(immutable), 'global.__immutable_core__ not defined')
      // create bind entry for module if it does not exist
      if (!defined(immutable.binds[this.meta.name])) {
          immutable.binds[this.meta.name] = {}
      }
      var moduleBinds = immutable.binds[this.meta.name]
      // create bind entry for method if it does not exist
      if (!defined(moduleBinds[methodName])) {
          moduleBinds[methodName] = {}
      }
      var methodBinds = moduleBinds[methodName]
      // create bind entry for bind type if it does not exist
      if (!defined(methodBinds[bindType])) {
          methodBinds[bindType] = {}
      }
      var bindTypeBinds = methodBinds[bindType]
      // get global bind if any
      var globalBind = bindTypeBinds[bindMethod.meta.signature]
      // throw error on override
      this.assert(!defined(globalBind) || !globalBind.bound || immutable.defaultAllowOverride, `method ${bindMethod.meta.signature} already bound ${bindType} to ${methodName}`)
      // add bind to global binds
      if (defined(globalBind)) {
          globalBind.bound = true
      }
      // create global bind
      else {
          bindTypeBinds[bindMethod.meta.signature] = {
              bound: true,
              method: bindMethod,
          }
      }
      // create bind list for method if it does not already exist
      if (!defined(method.meta[bindType])) {
          method.meta[bindType] = []
      }
      // add bind method to bind list
      method.meta[bindType].push(bindMethod)
  }