_calculateValues({ source } = { source: null }) {
      if (this.__preventRecursiveTrigger) return; // prevent infinite loops

      /** @type {boolean} */
      this.__preventRecursiveTrigger = true;
      if (source !== 'model') {
        if (source === 'serialized') {
          /** @type {?} */
          this.modelValue = this.deserializer(this.serializedValue);
        } else if (source === 'formatted') {
          this.modelValue = this._callParser();
        }
      }
      if (source !== 'formatted') {
        this.formattedValue = this._callFormatter();
      }
      if (source !== 'serialized') {
        this.serializedValue = this.serializer(this.modelValue);
      }
      this._reflectBackFormattedValueToUser();
      this.__preventRecursiveTrigger = false;
      this.__prevViewValue = this.value;
    }
Responsible for storing all representations(modelValue, serializedValue, formattedValue
and value) of the input value. Prevents infinite loops, so all value observers can be
treated like they will only be called once, without indirectly calling other observers.
(in fact, some are called twice, but the __preventRecursiveTrigger lock prevents the
second call from having effect).

@param {{source:'model'|'serialized'|'formatted'|null}} config - the type of value that triggered this method. It should not be
set again, so that its observer won't be triggered. Can be:
'model'|'formatted'|'serialized'.
@protected