package util type Event struct { eventName string payload interface{} } func NewEvent(eventName string, payload interface{}) *Event { return &Event{ eventName, payload, } } func (e *Event) EventName() string { return e.eventName } func (e *Event) Payload() interface{} { return e.payload } type EventHandler func(payload interface{}) type EventBus struct { handlers map[string][]EventHandler } func NewEventBus() *EventBus { return &EventBus{make(map[string][]EventHandler)} } func (eb *EventBus) Register(eventName string, handler EventHandler) { eb.handlers[eventName] = append(eb.handlers[eventName], handler) } func (eb *EventBus) Handle(e Event) { for _, handler := range eb.handlers[e.EventName()] { handler(e.Payload()) } }