@startuml
Interface Manager
Interface StorageController<T> {
    + T Query()
    + void Add()
    + void Remove()
    + void Update()
}

class UserACL {
    + bool canAddPost
    + bool canRemovePost
    + bool canUpdatePost
    + bool canGainMileage
    + bool canExchangeAtShop
    + bool isAdministrator
    + int ToBitwiseInteger()
    + bool Contains(UserACL other)
}

class User {
    + UserUUID identifier
    + String loginID
    + String loginPasswordHash
    + String email
    + UserACL acl
}

class UserManager implements Manager {
    + void Register(User _new)
}
UserManager --- User : use

class UserSessionManager implements Manager {
    + void LoginUser(String loginID, String loginPasswordHash)
    + void Logout()
    + User GetCurrentLogin()
}
UserSessionManager --- User : use

class UserStorageController<T> implements StorageController {}
UserStorageController --- User : use

User "1" o-- "1" UserUUID : contains
User "1" o-- "1" UserACL : contains

' User Management SubSystem

class UserManagementSubSystem {
    + {static} UserManager userManager
    + {static} UserSessionManager userSessionManager
    + {static} UserStorageController userStorageController
}

UserManagementSubSystem "1" o-- "1" UserManager : contains
UserManagementSubSystem "1" o-- "1" UserSessionManager : contains
UserManagementSubSystem "1" o-- "1" UserStorageController : contains
@enduml
