docs: <TYPE extends LayerCategoryInfo> TYPE getInfo(String layerId, CacheCategory cacheCategory, Class<TYPE> type) {
  		TYPE specific = null;
  		TYPE semiLayer = null;
  		TYPE semiCategory = null;
  		TYPE fallback = null;
  		Collection<TYPE> options = applicationContext.getBeansOfType(type).values();
  		for (TYPE option : options) {
  			String optLayer = option.getLayerId();
  			CacheCategory optCategory = option.getCategory();
  			if (null != optLayer) {
  				if (optLayer.equals(layerId)) {
  					if (null != optCategory) {
  						if (optCategory.equals(cacheCategory)) {
  							specific = option;
  						}
  					} else {
  						semiLayer = option;
  					}
  				}
  			} else {
  				if (null != optCategory) {
  					if (optCategory.equals(cacheCategory)) {
  						semiCategory = option;
  					}
  				} else {
  					fallback = option;
  				}
  			}
  		}
  		if (null != specific) {
  			return specific;
  		}
  		if (null != semiLayer) {
  			return semiLayer;
  		}
  		if (null != semiCategory) {
  			return semiCategory;
  		}
  		return fallback;
  	}