+ inline Handler addHandler(const std::string& message,
+ const Function& callback, Handler id)
+ {
+ mCallbacks.insert(std::make_pair(message, std::make_pair(id, callback)));
+ mHandlers.insert(std::make_pair(id, message));
+
+ return id;
+ }
+
+ inline void removeHandler(Handler id)
+ {
+ std::pair<HandlerIter,HandlerIter> matching(mHandlers.equal_range(id));
+
+ for (HandlerIter it = matching.first; it != matching.second; ++it)
+ {
+ CallbackIter first = mCallbacks.find((*it).second);
+ CallbackIter last = mCallbacks.end();
+
+ for (CallbackIter jt = first; jt != last; ++jt)
+ {
+ if ((*jt).second.first == id)
+ {
+ mCallbacks.erase(jt);
+ break;
+ }
+ }
+ }
+
+ mHandlers.erase(id);
+ }
+
+ void dispatch(const std::string& message, const Notification* param)
+ {
+ std::pair<CallbackIter,CallbackIter>
+ callbacks(mCallbacks.equal_range(message));
+
+ for (CallbackIter it = callbacks.first; it != callbacks.second; ++it)
+ {
+ Function callback = (*it).second.second;
+ callback(param);
+ }
+ }
+
+
+ unsigned long mId;
+
+ CallbackLookup mCallbacks;
+ HandlerLookup mHandlers;