acquire (params, scrollable) {
    // console.log('Popover.acquire()', params)

    // Note: allowing to update the current popover using the requestId of a previous run
    if (params.update) {
      return this._update(params)
    }

    // NOTE: this implements a toggle behavior. I.e. if the same requester
    // requests the popover for the same position, then we hide the popover
    const state = this.state
    if (params.toggle && state.requester === params.requester) {
      // console.log('Popover: toggling')
      this._hide()
      return false
    }

    this._checkParams(params)
    this.setState(Object.assign({}, params, { requestId: uuid(), scrollable }))

    // ATTENTION: we have to postpone showing the content
    // as otherwise, e.g. the DOM selection is not yet updated,
    // which is needed for positioning
    if (platform.inBrowser) {
      window.requestAnimationFrame(() => {
        this._showPopover()
      })
    }
    return this.state.requestId
  }
Request to render a popover, given either a menu specification or a render function,
at the given position.

To receive actions, the requesting component has to be provided.

@param {object} params
@param {Function|object} params.content - a render function or a menu specification (see renderMenu)
@param {object} params.desiredPos
@param {number} params.desiredPos.x - the desired x screen coordinate
@param {number} params.desiredPos.y - the desired y screen coordinate
@param {Component} [params.requester] - the component that is requesting the content; this is used to dispatch actions