triggerDidMount (options = {}) {
    // don't trigger didMount if that has been done already
    // Note: that this is ATM accepted for the sake of simplicity of
    // forwarding components implementation
    // TODO: consider avoiding this, and turn this into a visible warning
    if (this.__isMounted__) {
      if (substanceGlobals.VERBOSE_RENDERING) {
        console.warn('Calling triggerDidMount() on an already mounted component.')
      }
      return
    }

    // Following react's life-cycle, 'didMount' is triggered 'bottom-up'
    // i.e. children first.
    if (!options.noDescent) {
      if (this._isForwarding()) {
        this._getForwardedComponent().triggerDidMount({ noAscent: true })
      } else {
        const children = this.getChildren()
        for (const child of children) {
          child.triggerDidMount()
        }
      }
    }

    // ATTENTION: it is important to have this before calling didMount()
    // so that in case of a state change or such during didMount() the children will get triggered.
    this.__isMounted__ = true
    this.didMount()

    // ATTENTION: forwarding components are 'invisible' with respect to the
    // DOM elements, i.e. not covered by the recursion done here using this.getChildren()
    // so we trigger explicitly
    if (this._isForwarded() && !options.noAscent) {
      this.getParent().triggerDidMount({ noDescent: true })
    }
  }
Triggers didMount handlers recursively.

    Gets called when using `component.mount(el)` on an element being
    in the DOM already. Typically this is done for a root component.

    If this is not possible because you want to do things differently, make sure
    you call 'component.triggerDidMount()' on root components.

    @param isMounted an optional param for optimization, it's used mainly internally
    @private
    @example

    ```
    let frag = document.createDocumentFragment()
    let comp = MyComponent.mount(frag)
    ...
    $('body').append(frag)
    comp.triggerDidMount()
    ```