#ifndef EVENT_H #define EVENT_H namespace icinga { struct I2_BASE_API EventArgs : public Object { typedef shared_ptr Ptr; typedef weak_ptr WeakPtr; Object::Ptr Source; }; template class Event { public: typedef function DelegateType; private: list m_Delegates; public: void Hook(const DelegateType& delegate) { m_Delegates.push_front(delegate); } void Unhook(const DelegateType& delegate) { m_Delegates.remove(delegate); } Event& operator +=(const DelegateType& rhs) { Hook(rhs); return *this; } Event& operator -=(const DelegateType& rhs) { Unhook(rhs); return *this; } void operator()(const TArgs& args) { typename list::iterator prev, i; for (i = m_Delegates.begin(); i != m_Delegates.end(); ) { prev = i; i++; int result = (*prev)(args); if (result == -1) m_Delegates.erase(prev); } } }; } #endif /* EVENT_H */