@startuml allowmixing abstract class StateMachineManager { + states: async* S - machines: [StateMachine] - queue: Queue -- + accept(E event): void => queue.add(event); - dispatch(E event): void => machines[E].accept(event); -- + {method} << public API methods >> } abstract class StateMachine { + states: async* S - manager: StateMachineManager - queue: Queue + accept(E event): void => queue.add(event); - dispatch(E event): void => manager.dispatch(event); - emit(S state): void => states.add(state); } abstract class StateMachineEvent { + type: String } abstract class StateMachineState { + type: String } StateMachineManager *- StateMachineEvent StateMachineManager *- StateMachineState StateMachine *- StateMachineEvent StateMachine *- StateMachineState StateMachineManager o- StateMachine actor Developer Developer -> StateMachineManager @enduml