@startuml
!include style.puml
skinparam arrowThickness 2
skinparam arrowColor LOGIC_COLOR
skinparam classBackgroundColor LOGIC_COLOR

skinparam Note {
    BackgroundColor #white
}

package Logic {

package Parser {
Interface Parser <<Interface>>
Class JJIMYParser
Interface ComponentParser <<Interface>>
Class CustomerParser
Class MenuParser
Class OrderParser
Class InventoryParser
Class ComponentXYZCommandParser
Class CliSyntax
Class ParserUtil
Class ArgumentMultimap
Class ArgumentTokenizer
Class Prefix
}

package Command {
Class XYZCommand
Class CommandResult
Class "{abstract}\nCommand" as Command
}

Interface Logic <<Interface>>
Class LogicManager
}

package Model{
Class HiddenModel #FFFFFF
}

Class HiddenOutside #FFFFFF
HiddenOutside ..> Logic

LogicManager --> "1" JJIMYParser
JJIMYParser .right.> ComponentParser: creates >
CustomerParser .up.|> ComponentParser
MenuParser .up.|> ComponentParser
OrderParser .up.|> ComponentParser
InventoryParser .up.|> ComponentParser
CustomerParser ..> ComponentXYZCommandParser: creates >
MenuParser ..> ComponentXYZCommandParser: creates >
OrderParser ..> ComponentXYZCommandParser: creates >
InventoryParser ..> ComponentXYZCommandParser: creates >

ComponentXYZCommandParser ..> XYZCommand: creates >
ComponentXYZCommandParser .left.|> Parser : \t\t\t
ComponentXYZCommandParser ..> ArgumentMultimap
ComponentXYZCommandParser ..> ArgumentTokenizer
ArgumentTokenizer .left.> ArgumentMultimap
ComponentXYZCommandParser ..> CliSyntax
CliSyntax ..> Prefix
ComponentXYZCommandParser ..> ParserUtil
ParserUtil .down.> Prefix
ArgumentTokenizer .down.> Prefix

LogicManager .up.|> Logic
XYZCommand -up-|> Command
LogicManager .left.> Command : executes >

LogicManager -left-> Model
Command .left.> Model
'note right of XYZCommand: XYZCommand = AddCommand, \nFindCommand, etc

Logic ..> CommandResult
LogicManager .down.> CommandResult
Command .up.> CommandResult
CommandResult -[hidden]-> Parser
@enduml
