class ConfigObserver {

    public <T> ConfigObserver onPrefixedValue(String prefix, ConfigValueListener<Map<String, String>> listener) {
        return onConfigChange(new ConfigListener() {
            @Override
            public void onConfigChanged(Set<String> changedKeys, ConfigMap newConfiguration) {
                if (changeIncludes(changedKeys, prefix)) {
                    applyConfiguration(listener, newConfiguration.subMap(prefix).orElse(new ConfigMap()));
                }
            }
        });
    }

    public  ConfigObserver(String applicationName);
    public  ConfigObserver(File configDirectory, String applicationName);
    public  ConfigObserver(File configDirectory, String applicationName, List<String> profiles);
    public  ConfigObserver(ConfigLoader configLoader);

}