Listing 4
// the core interface of the Messaging class template < class Listener, typename Context = int, class Mutex = NoSynchronization, class BagType = std::vector<Listener*> > class Messaging { public: // registers the listener // listeners registered more than once will be notified // once for each registration void addListener(Listener *listener) { listeners_.add(listener); } // unregisters the listener // it doesn't hurt if it's not already registered // multiply registered listeners should also multiply // unregister themselves void removeListener(Listener *listener) { listeners_.remove(listener); } protected: // this method should be called by the derived class // to trigger event dispatching void raiseEvent(const Context &context) { typedef typename BagType::iterator iterator; BagType frozen(listeners_.getFrozen()); iterator it; iterator itend = frozen.end(); for (it = frozen.begin(); it != itend; ++it) { Listener *p = static_cast<Listener*>(*it); dispatchEvent(p, context); } } // this is intended to be overriden in a derived class // and is responsible for the actual dispatching // this method is called for every registered listener // (once for each registration) // the overriding method should call the listener, // using (or not) the context as a clue virtual void dispatchEvent(Listener *listener, const Context &context) = 0; private: // the synchronized container for keeping pointers // to listener objects ListenersCollection<Listener, Mutex, BagType> listeners_; };