docs: function cache (...args) {
    // handle @cache at the method-level without arguments
    if (args.length === 3 && typeof args[0].constructor === 'function') {
      Metadata.putMethodMeta(args[0], args[1], '@cache', 'options', {});
    } else if (args.length === 1 && typeof args[0] === 'function') {
      // handle @cache at the class-level without arguments
      Metadata.putClassMeta(args[0].prototype, '@cache', 'options', {});
    } else {
      // handle @cache() at the class and method-level with arguments
      return function (target, key) {
        if (args.length > 0 && typeof args[0] !== 'object') {
          throw new $err.IllegalValue(
            'Only an options object may be supplied to the @cache decorator');
        }
        const options = args.length > 0 ? args[0] : {};
        if (key === undefined) {
          Metadata.putClassMeta(target.prototype, '@cache', 'options', options);
        } else {
          Metadata.putMethodMeta(target, key, '@cache', 'options', options);
        }
      };
    }
  }