code: protected static void notifyListeners(Set<ConfigurationListener<?>> listeners, ConfigurationParser configParser, Logger log) {
      if(!listeners.isEmpty()) {
        for(ConfigurationListener<?> listener : listeners) {
          if(listener instanceof ConfigurationLocationAware) {
            log.debug("Telling listener {} which directory the configuration is in {}", listener, configParser.getConfigurationDirectory());
            ConfigurationLocationAware locationAware = (ConfigurationLocationAware) listener;
            locationAware.setConfigurationDirectory(configParser.getConfigurationDirectory());
          }
          log.debug("Trying to notify listener {}", listener);
          Class<?> configClasses[] = getListenerGenericTypes(listener.getClass(), log);
          if(configClasses != null) {
            for(Class<?> type : configClasses) {
              CadmiumConfig cfgAnnotation = type.getAnnotation(CadmiumConfig.class);
              if(cfgAnnotation != null) {
                String key = type.getName();
                if(!StringUtils.isEmptyOrNull(cfgAnnotation.value())) {
                  key = cfgAnnotation.value();
                }
                log.debug("Fetching configuration with key {}", key);
                try {
                  Object cfg = configParser.getConfiguration(key, type);
                  log.debug("Notifying listener {} with new configuration {}", listener, cfg);
                  listener.configurationUpdated(cfg);
                } catch(ConfigurationNotFoundException e) {
                  log.debug("Configuration not found. Notifying listener {}.", listener);
                  listener.configurationNotFound();
                }
              } 
            }
          }
        }
      }
    }
docs: This notifies listeners from a given set of the state of the configurations from a {@link ConfigurationParser}.
  @param listeners
  @param configParser
  @param log