// https://www.youtube.com/watch?v=nLSm3Haxz0I class EventSource { void add(Listener& listener); void remove(Listener& listener); public: [[nodiscard]] Subscription subscribe(Listener& listener) { return Subscription(*this, listener); } }; class EventSource::Subscription { Subscription(EventSource& source, Listener& listener) : source_(source), listener_(listener) { source_.add_listener(listener_); } ~Subscription() { source_.remove(listener_);} // special function members };