@startuml package ndef { class MessageParser { +MessageParser() +void set_delegate(Delegate *delegate) +void parse(const Span &data_buffer) } interface MessageParser::Delegate { +{abstract} void on_parsing_started() +{abstract} void on_record_parsed(const Record &record) +{abstract} void on_parsing_terminated() +{abstract} void on_parsing_error(error_t error) # ~Delegate() } enum MessageParser::error_t { } MessageParser +-- "0..1" MessageParser::Delegate MessageParser +-- MessageParser::error_t note top of "MessageParser::Delegate" Implemented by the client of the parsing operation. end note class Record { } class RecordType { } class RecordPayload { } class RecordID { } Record *-- RecordType Record *-- "0..1" RecordPayload Record *-- "0..1" RecordID MessageParser - Record: Produce > } @enduml