getViewHolderRef() {

    // the viewholder is never recalculated once it exists
    if (this.viewHolderRef) {
      return this.viewHolderRef;
    }

    this.logger('info', 'Retrieving or generating the view holder reference');

    // if given, try to retrieve the viewHolderRef by specified attribute
    const viewName = this.getAttr('view');
    let holderRef = null;

    if (viewName) {

      this.logger('log', `User wants to bind view "${viewName}' to graph`);

      const viewRef = `${$tm.path.views}/${viewName}`;

      if ($tw.wiki.getTiddler(viewRef)) {

        // create a view holder that is exclusive for this graph

        holderRef = `${$tm.path.localHolders}/${utils.genUUID()}`;
        this.logger('log', `Created an independent temporary view holder "${holderRef}"`);

        // we do not use setView here because it would store and reload the view unnecessarily...
        utils.setText(holderRef, viewRef);

        this.logger('log', `View "${viewRef}' inserted into independend holder`);

      } else {
        this.logger('log', `View "${viewName}" does not exist`);
      }

    }

    if (!holderRef) {
      this.logger('log', 'Using default (global) view holder');
      holderRef = $tm.ref.defaultViewHolder;
    }

    return holderRef;

  }
The view holder is a tiddler that stores a references to the current
view. If the graph is not bound to a view by the user via an
attribute, the default view holder is used. Otherwise, a temporary
holder is created whose value is set to the view specified by the user.
This way, the graph is independent from view changes made in a
tiddlymap editor.

This function will only calculate a new reference to the holder
on first call (that is when no view holder is registered to 'this'.