code: protected VALUE withCaching(KEY key, Supplier<VALUE> cacheLoader) {
  
      return getCache()
        .map(CachingTemplate::with)
        .<VALUE>map(template -> template.withCaching(key, () -> {
  
          setCacheMiss();
  
          return cacheLoader.get();
        }))
        .orElseGet(cacheLoader);
    }
docs: Enables an application service method to optionally apply and use caching to carry out its function.
  
  @param key {@link KEY key} used to look up an existing {@link VALUE value} in the {@link Cache}.
  @param cacheLoader {@link Supplier} used to compute/execute the application serivce method function
  if the {@link Cache} does not contain an already computed {@link VALUE value} or caching is not enabled.
  @return the cached or computed {@link VALUE value}.
  @see org.cp.elements.data.caching.support.CachingTemplate#withCaching(Comparable, Supplier)
  @see org.cp.elements.data.caching.Cache
  @see java.util.function.Supplier
  @see #isCachingEnabled()
  @see #getCache()