@startuml set namespaceSeparator \\ 'skinparam RankSep 100 'skinparam NodeSep 100 namespace MyGame\\Rules { namespace Exception { class InvalidGestureException << exception >> { } } interface IRules << interface >> { + getGestures(): array + compare(gesture1 : string, gesture2 : string): int + checkGesture(gesture : string): bool } class GenericRules << abstract >> { + __construct(gestures : Gestures\\IGestures) + getGestures(): array + compare(gesture1 : string, gesture2 : string): int + checkGesture(gesture : string): bool - getGestureIndex(gesture : string): int } class RockPaperScissors { + __construct() } class RockPaperScissorsLizardSpock { + __construct() } namespace Gestures { interface IGestures << interface >> { + getGestures(): array } } } 'MyGame\\Rules\\GenericRules o--> "-gestures [1..1]" MyGame\\Rules\\Gestures\\IGestures MyGame\\Rules\\Gestures\\IGestures "-gestures [1..1]" <--o MyGame\\Rules\\GenericRules MyGame\\Rules\\Exception\\InvalidGestureException -up-|> Exception MyGame\\Rules\\IRules <|.. MyGame\\Rules\\GenericRules MyGame\\Rules\\GenericRules <|-- MyGame\\Rules\\RockPaperScissors MyGame\\Rules\\GenericRules <|-- MyGame\\Rules\\RockPaperScissorsLizardSpock @enduml