Listing 1

struct EarlierEvent
{   bool operator ()(const EventProxy * left, const EventProxy * right)
    {return *left < *right;}
};
typedef std::vector<EventSrcProxy * > EvetnSourceVector;
typedef std::vector<EventProxy * > EventVector;
typedef std::priority_queue<EventProxy*,EventVector,EarlierEvent> EventQueue;
class EventDispatcher
{
public:
        void eventSourceRegister(EventSrcProxy * const es)
    {m_eventSources.push_back(es);}
    void addEventToDispachQueue(EventProxy * const ei)
    {m_eventDispatchQueue.push( ei);}
        void Loop();
    void terminate() { m_loop = false;}
friend EventDispatcher & theDispatcher();   
private:
    EventDispatcher(): m_loop(true) {};
        EvetnSourceVector  m_eventSources;
    EventQueue   m_eventDispatchQueue;
    bool m_loop;
};
class EventSrcProxy
{
public:
    EventSrcProxy(){theDispatcher().eventSourceRegister(this);}
    virtual ~EventSrcProxy(){};
    virtual void pollEvent() = 0;
};
class EventProxy {
public:
        EventProxy ():m_restore(false) {};
        virtual bool eventTrigged() = 0;
    virtual bool activateEvent() = 0;
    virtual void deactivateEvent() = 0;
    virtual void eventProcess() = 0;
    const bool operator<(const EventProxy & rhs) const 
        {return getTimeStamp() < rhs.getTimeStamp();}
    const time_t getTimeStamp() const {return m_timeStamp;}
protected:
    void setRestore(bool b) {m_restore = b;}
    const bool IsRestore() const {return m_restore;}
    //dtor in "protected", so an object of a derived class 
    //can only be created with "new" operator.
    virtual ~EventProxy () {};
private:
    time_t m_timeStamp;
    bool    m_restore;
};
void EventDispatcher::Loop()
{   while (m_loop)
    {   //For each event source, poll event
        EvetnSourceVector::iterator it_eSrc;
for (it_eSrc = m_eventSources.begin();
                        it_eSrc != m_eventSources.end(); it_eSrc ++)
        {   (*it_eSrc)->pollEvent();}
        //process events in dispatch queue
        while (!m_eventDispatchQueue.empty())
        {   EventProxy *eip;
            eip = m_eventDispatchQueue.top();
            m_eventDispatchQueue.pop();
            eip->eventProcess();
        }
    }
}
EventDispatcher & theDispatcher()
{static EventDispatcher _disp;
    return _disp;
}