async _getMessage(data) {
    const ctor = /** @type {typeof Validator} */ (this.constructor);
    const composedData = {
      name: ctor.validatorName,
      type: this.type,
      params: this.param,
      config: this.config,
      ...data,
    };
    if (this.config.getMessage) {
      if (typeof this.config.getMessage === 'function') {
        return this.config.getMessage(composedData);
      }
      throw new Error(
        `You must provide a value for getMessage of type 'function', you provided a value of type: ${typeof this
          .config.getMessage}`,
      );
    }
    return ctor.getMessage(composedData);
  }
This is a protected method that usually should not be overridden. It is called by ValidateMixin
and it gathers data to be passed to getMessage functions found:
- `this.config.getMessage`, locally provided by consumers of the Validator (overrides global getMessage)
- `MyValidator.getMessage`, globally provided by creators or consumers of the Validator

Confusion can arise because of similarities with former mentioned methods. In that regard, a
better name for this function would have been _pepareDataAndCallHighestPrioGetMessage.
@example
```js
class MyValidator extends Validator {
  // ...
  // 1. globally defined
  static async getMessage() {
    return 'lowest prio, defined globally by Validator author'
  }
}
// 2. globally overridden
MyValidator.getMessage = async() => 'overrides already configured message';
// 3. locally overridden
new MyValidator(myParam, { getMessage: async() => 'locally defined, always wins' });
```
@param {Partial<FeedbackMessageData>} [data]
@returns {Promise<string|Element>}
@protected