code: function _off (event, method, context) {
    /* eslint-disable no-invalid-this */
    if (arguments.length === 0) {
      if (DEBUG) {
        forEach(this.__events__, (bindings) => {
          bindings.forEach((b) => {
            console.info('_off()', b.method.name, b.context, this)
          })
          count -= bindings.length
        })
        console.info(COUNT_MSG, count)
      }
      this.___events___ = {}
      return this
    }
    if (arguments.length === 1) {
      // Remove all bindings for event
      if (DEBUG) {
        count -= (this.__events__[event] || []).length
        console.info(COUNT_MSG, count)
      }
      delete this.__events__[event]
      return this
    }
    validateMethod(method, context)
    if (!(event in this.__events__) || !this.__events__[event].length) {
      if (DEBUG) console.info('NO MATCHING BINDINGS')
      // No matching bindings
      return this
    }
    // Default to null context
    if (arguments.length < 3) {
      context = null
    }
    // Remove matching handlers
    let bindings = this.__events__[event]
    for (let i = bindings.length - 1; i >= 0; i--) {
      const b = bindings[i]
      if (b.method === method && b.context === context) {
        bindings.splice(i, 1)
        if (DEBUG) count--
      }
    }
    // Cleanup if now empty
    if (bindings.length === 0) {
      delete this.__events__[event]
    }
    if (DEBUG) console.info(COUNT_MSG, count)
    return this
    /* eslint-enable no-invalid-this */
  }
docs: /*
  Remove a listener.
  
  @param {String} event
  @param {Function} method
  @param {Object} context