@SuppressWarnings({"rawtypes", "unchecked"}) protected <M extends Map, F> M buildCompositeMap( Function<F, M> mapMaker, PreferenceValueFunction<M> preferenceValueFunction, Collection<? extends IStylesheetData> defaults, M... extraDataMaps) { final M compositeMap = mapMaker.apply(null); // Add data from the stylesheet descriptor for (final IStylesheetData defaultData : defaults) { final String defaultValue = defaultData.getDefaultValue(); final String name = defaultData.getName(); compositeMap.put(name, defaultValue); } // Add any pre-existing data to the composite map for (final M existingValue : extraDataMaps) { compositeMap.putAll(existingValue); } // Iterate through scopes adding data from each stylesheet user prefs objects for (final Scope scope : Scope.values()) { final IStylesheetUserPreferences stylesheetUserPreferences = this.getStylesheetUserPreferences(scope, false); if (stylesheetUserPreferences != null) { final Map preferences = preferenceValueFunction.getPreferences(stylesheetUserPreferences); compositeMap.putAll(preferences); } } return compositeMap; }