docs: private MethodMetaData<? extends Annotation> getMethodMetaData(Method method) {
        MethodMetaData<? extends Annotation> methodMetaData = methodMetaDataCache.get(method);
  
        if (methodMetaData == null) {
           final String cacheName;
           final Annotation cacheAnnotation;
           final AggregatedParameterMetaData aggregatedParameterMetaData;
           final CacheKeyGenerator cacheKeyGenerator;
           final CacheDefaults cacheDefaultsAnnotation = method.getDeclaringClass().getAnnotation(CacheDefaults.class);
  
           if (method.isAnnotationPresent(CacheResult.class)) {
              final CacheResult cacheResultAnnotation = method.getAnnotation(CacheResult.class);
              cacheKeyGenerator = getCacheKeyGenerator(beanManager, cacheResultAnnotation.cacheKeyGenerator(), cacheDefaultsAnnotation);
              cacheName = getCacheName(method, cacheResultAnnotation.cacheName(), cacheDefaultsAnnotation, true);
              aggregatedParameterMetaData = getAggregatedParameterMetaData(method, false);
              cacheAnnotation = cacheResultAnnotation;
  
           } else if (method.isAnnotationPresent(CacheRemove.class)) {
              final CacheRemove cacheRemoveEntryAnnotation = method.getAnnotation(CacheRemove.class);
              cacheKeyGenerator = getCacheKeyGenerator(beanManager, cacheRemoveEntryAnnotation.cacheKeyGenerator(), cacheDefaultsAnnotation);
              cacheName = getCacheName(method, cacheRemoveEntryAnnotation.cacheName(), cacheDefaultsAnnotation, false);
              aggregatedParameterMetaData = getAggregatedParameterMetaData(method, false);
              cacheAnnotation = cacheRemoveEntryAnnotation;
  
              if (cacheName.isEmpty()) {
                 throw log.cacheRemoveEntryMethodWithoutCacheName(method.getName());
              }
  
           } else if (method.isAnnotationPresent(CacheRemoveAll.class)) {
              final CacheRemoveAll cacheRemoveAllAnnotation = method.getAnnotation(CacheRemoveAll.class);
              cacheKeyGenerator = null;
              cacheName = getCacheName(method, cacheRemoveAllAnnotation.cacheName(), cacheDefaultsAnnotation, false);
              aggregatedParameterMetaData = getAggregatedParameterMetaData(method, false);
              cacheAnnotation = cacheRemoveAllAnnotation;
  
              if (cacheName.isEmpty()) {
                 throw log.cacheRemoveAllMethodWithoutCacheName(method.getName());
              }
  
           } else if (method.isAnnotationPresent(CachePut.class)) {
              final CachePut cachePutAnnotation = method.getAnnotation(CachePut.class);
              cacheKeyGenerator = getCacheKeyGenerator(beanManager, cachePutAnnotation.cacheKeyGenerator(), cacheDefaultsAnnotation);
              cacheName = getCacheName(method, cachePutAnnotation.cacheName(), cacheDefaultsAnnotation, true);
              aggregatedParameterMetaData = getAggregatedParameterMetaData(method, true);
              cacheAnnotation = cachePutAnnotation;
  
           } else {
              throw log.methodWithoutCacheAnnotation(method.getName());
           }
  
           final MethodMetaData<? extends Annotation> newCacheMethodMetaData = new MethodMetaData<Annotation>(
                 method,
                 aggregatedParameterMetaData,
                 asSet(method.getAnnotations()),
                 cacheKeyGenerator,
                 cacheAnnotation,
                 cacheName
           );
  
           methodMetaData = methodMetaDataCache.putIfAbsent(method, newCacheMethodMetaData);
           if (methodMetaData == null) {
              methodMetaData = newCacheMethodMetaData;
           }
        }
  
        return methodMetaData;
     }