code: <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;
  	}
docs: Find the info object for the layer/category pair. It uses the last defined, either with matching layer and
  category, with matching layer and null category, with null layer and matching category, with both null, in that
  order.
  
  @param layerId layer to search for
  @param cacheCategory category to search for
  @param type type of info object to find
  @param <TYPE> type of info object to find
  @return configuration object of requested type or null if not found