@startuml

    !include ../lexakai/lexakai.theme
    
    title "com.telenav.kivakit.core.kernel.language.collections.map.string"
    
    abstract BaseStringMap
    abstract BaseMap
    abstract BaseIndexedMap
    
    interface PropertyValueSource
    
    BaseMap <|-- BaseStringMap
    PropertyValueSource <|-- BaseStringMap
    abstract class BaseStringMap<Value>
    {
        --(constructors)--
        #BaseStringMap(Maximum)
        #BaseStringMap(Maximum, Map<String, Value>)
        --(collection)--
        +StringList asStringList()
        --(lifecycle)--
        +String join(String separator)
    }
    
    BaseIndexedMap <|-- IndexedNameMap
    class IndexedNameMap<T>
    {
        --(constructors)--
        +IndexedNameMap()
        +IndexedNameMap(Maximum)
        --(collection)--
        +void put(T value)
        --(naming)--
        +T forName(String name)
    }
    
    BaseStringMap <|-- NameMap
    class NameMap<NamedObject>
    {
        --(constructors)--
        +NameMap()
        +NameMap(Maximum)
        +NameMap(Maximum, Map<String, NamedObject>)
        --
        +void caseSensitive(boolean caseSensitive)
        --(collection)--
        +void add(NamedObject value)
        --(naming)--
        +NamedObject get(String name)
        +NamedObject get(Name)
    }
    
    BaseStringMap <|-- StringMap
    class StringMap<T>
    {
        --(constructors)--
        +StringMap()
        +StringMap(Maximum)
    }
    
    BaseStringMap <|-- StringToStringMap
    class StringToStringMap
    {
        --(constructors)--
        +StringToStringMap()
        +StringToStringMap(Maximum)
        --
        +String get(String key)
        --(collection)--
        +Count count(String key)
        --(primitive)--
        +int asInt(String key)
    }
    
    BaseStringMap <|-- VariableMap
    class VariableMap<Value>
    {
        --(constructors)--
        +VariableMap()
        +VariableMap(Maximum)
        --
        +String expand(String text)
        --(collection)--
        +VariableMap<Value> add(String name, Value object)
        +VariableMap<Value> addAll(Object, PropertyFilter)
        +VariableMap<Value> addAll(VariableMap<Value> variables)
        +VariableMap<Value> addAll(Object, PropertyFilter, Value nullValue)
        +VariableMap<Value> copy()
        +VariableMap<String> expanded()
        +VariableMap<String> of(Map<String,String> that)
        +VariableMap<String> withQuotedValues()
    }
    
@enduml

