class SystemPropertiesLoader {

    public void load() {
        if (withCommon) {
            load(new FileWithSections(SystemProperties.CONF_FILE_COMMON));
        }

        files.forEach(this::load);

        if (withAtLeastOneOf) {
            try {
                loadMutuallyAlternativeFilesInEntryOrder(mutuallyAlternativeFiles);
            } catch (FileNotFoundException e) {
                log.error("Configuration loading failed", e);
            }
        }

        if (withAddOn) {
            try {
                Path addOnDir = Paths.get(SystemProperties.CONF_FILE_ADDON_PATH);
                loadFilesInOrder(addOnDir, ADDON_GLOB, LOADING_ORDER_COMPARATOR);
            } catch (IOException e) {
                log.error("Cannot load addon configuration", e);
            }
        }

        if (withOverrides) {
            try {
                Path overrideDir = Paths.get(SystemProperties.getConfPath(), "conf.d");
                loadFilesInOrder(overrideDir, OVERRIDE_GLOB, LOADING_ORDER_COMPARATOR);
            } catch (IOException e) {
                log.error("Cannot load override configuration", e);
            }
        }

        if (withLocal) {
            load(new FileWithSections(SystemProperties.CONF_FILE_USER_LOCAL));
        }

        optionalLocalFiles.forEach(f -> {
            if (Files.isReadable(Paths.get(f.getName()))) {
                load(f);
            }
        });

        log.debug("Loaded properties:\n{}", loadedProperties);
    }

    protected  SystemPropertiesLoader(String prefix);

}