@startuml core_objects

namespace core {
    class SimpleUpdate {
        #_call_soon(id, allow_skips)
        #_call_later(id, delay_ns, allow_skips)
        #_call_cancel(id)
        #{abstract} _update(id, update_time_ns, cur_time_ns): int
        #_on_attach()
        #_on_detach()
        +is_attached: bool
        +detach(): bool
    }

    class IOUpdate {
        #_call_soon(id, allow_skips)
        #_call_later(id, delay_ns, allow_skips)
        #_call_cancel(id)
        #_set_event_mask(fd, mask)
        #_unset_event_mask(fd)
        #{abstract} _on_event(fd, flag)
        #_update(id, update_time_ns, cur_time_ns): int
        #_on_attach()
        #_on_detach()
        +is_attached: bool
        +detach(): bool
    }

    class StreamSubscriber {
        #{abstract} _on_get_data(item)
        #_on_attach()
        #_on_detach()
        +is_attached: bool
        +detach(): bool
    }

    class BusyThreadUpdater {
        +{static} create(): BusyThreadUpdater
        +start()
        +stop()
        +has(obj): bool
        +add(obj)
        +remove(obj): bool
        +clear()
    }

    class EventThreadUpdater {
        +{static} create(): EventThreadUpdater
        +start()
        +stop()
        +has(obj): bool
        +add(obj)
        +remove(obj): bool
        +clear()
    }

    class StreamMaster {
        +{static} create(): StreamMaster
        +add(sub)
        +has(sub)
        +remove(sub): bool
        +push(item)
        +clear()
        +transform(transform): SimpleStream
    }

    BusyThreadUpdater o-- SimpleUpdate
    EventThreadUpdater o-- SimpleUpdate
    EventThreadUpdater o-- IOUpdate
    StreamMaster o-- StreamSubscriber
}

@enduml