class MapBackedGsubData implements GsubData
{

    private final Language language;
    private final String activeScriptName;
    private final Map<String, Map<List<Integer>, Integer>> glyphSubstitutionMap;

    public MapBackedGsubData(Language language, String activeScriptName,
            Map<String, Map<List<Integer>, Integer>> glyphSubstitutionMap)
    {
        this.language = language;
        this.activeScriptName = activeScriptName;
        this.glyphSubstitutionMap = glyphSubstitutionMap;
    }

    @Override
    public Language getLanguage()
    {
        return language;
    }

    @Override
    public String getActiveScriptName()
    {
        return activeScriptName;
    }

    @Override
    public boolean isFeatureSupported(String featureName)
    {
        return glyphSubstitutionMap.containsKey(featureName);
    }

    @Override
    public ScriptFeature getFeature(String featureName)
    {<FILL_FUNCTION_BODY>}

    @Override
    public Set<String> getSupportedFeatures()
    {
        return glyphSubstitutionMap.keySet();
    }

}

        if (!isFeatureSupported(featureName))
        {
            throw new UnsupportedOperationException(
                    "The feature " + featureName + " is not supported!");
        }

        return new MapBackedScriptFeature(featureName, glyphSubstitutionMap.get(featureName));
    
<no_super_class>