@startuml
skinparam classAttributeIconSize 0
hide circle

class "Parser" as parser
class "Command" as command

class parser <<abstract>> {
    -prepareViewBudgetCommand(): Command
    -prepareSetBudgetCommand(): Command
    -prepareDeleteExpenseCommand(): Command
    -prepareDeleteIncomeCommand(): Command
    -prepareAddExpenseCommand(): Command
    -prepareAddIncomeCommand(): Command
    -prepareListExpenseCommand(): Command
    -prepareListIncomeCommand(): Command
    -prepareEditExpenseCommand(): Command
    -prepareEditIncomeCommand(): Command
    -checkAddCommandException(): String[]
    -checkExceedMaxCharForAmount(): String
    -checkValidOptionalTimeFlagException(): String
    -checkEmptyAddFlag(): void
    -checkEmptyFlag(): void
    -checkTimeException(): void
    -checkDoubleException(): void
    -checkEditCommandException(): String[]
    -checkContainFlagsException(): void
    -checkIsIntegerIndex(): void
    -checkCorrectType(): void
    +parseCommand(): Command
}

class command <<abstract>> {
    {abstract} +execute(): void
}

class UserInput <<abstract>> {
    #userCommand: String
    #userDescription: String

    #UserInput(String, String)
    #splitUserInput(): UserInput
}

parser --> command
parser .> UserInput

@enduml