class ConfigurationParser {

    public C parse(ConfigurationSource provider) {
        LOGGER.debug("Parsing configuration in format={} from source={}", format, provider);

        C configuration = doParse(provider).withOverrides(overrides);

        PlaceholderResolutionResult<C> resolved = configuration.resolvePlaceholders(overrides);

        if (!resolved.unresolvedPlaceholders().isEmpty()) {
            throw new IllegalStateException(format("Unresolved placeholders: %s", resolved.unresolvedPlaceholders()));
        }

        return resolved.resolvedConfiguration();
    }

    private  ConfigurationParser(Builder<C> builder);

}