]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Dispatcher.hh
port to NetBSD
[chaz/yoink] / src / Moof / Dispatcher.hh
index ec143b46fdce105a7021f79cc4a2ecb1027144f4..7945752df0b21ff3b97aa2104ee1b6bc1c3e4c0b 100644 (file)
 
 #include <string>
 
-#include <boost/shared_ptr.hpp>
+#include <boost/bind.hpp>
 #include <boost/function.hpp>
-
-#include <Moof/Singleton.hh>
+#include <boost/shared_ptr.hpp>
 
 
 namespace Mf {
@@ -47,7 +46,7 @@ namespace Mf {
 class Notification
 {
 public:
-       virtual ~Notification();
+       virtual ~Notification() {};
 };
 
 
@@ -55,13 +54,24 @@ public:
  * Dispatcher of notifications to interested parties.
  */
 
-class Dispatcher : public Singleton<Dispatcher>
+class Dispatcher
 {
+       class Impl;
+       boost::shared_ptr<Impl> mImpl;
+
 public:
+
+       // TODO - the Handler would be even better as an object which automagically
+       // removes itself from the dispatcher on destruction, so users don't have to
+       // worry about forgetting
        typedef void* Handler;
-       typedef boost::function<void(const Notification&)> Function;
+       typedef boost::function<void(const Notification*)> Function;
 
        Dispatcher();
+       ~Dispatcher();
+
+       // get global instance
+       static Dispatcher& getInstance();
 
        Handler addHandler(const std::string& message, const Function& callback);
        Handler addHandler(const std::string& message, const Function& callback,
@@ -69,15 +79,37 @@ public:
 
        void removeHandler(Handler id);
 
-       void dispatch(const std::string& message);
-       void dispatch(const std::string& message, const Notification& param);
-
-private:
-       class DispatcherImpl;
-       boost::shared_ptr<DispatcherImpl> impl_;
+       void dispatch(const std::string& message, const Notification* param = 0);
 };
 
 
+namespace dispatcher {
+
+inline Dispatcher::Handler addHandler(const std::string& message,
+               const Dispatcher::Function& callback)
+{
+       return Dispatcher::getInstance().addHandler(message, callback);
+}
+
+inline Dispatcher::Handler addHandler(const std::string& message,
+               const Dispatcher::Function& callback, Dispatcher::Handler id)
+{
+       return Dispatcher::getInstance().addHandler(message, callback, id);
+}
+
+inline void removeHandler(Dispatcher::Handler id)
+{
+       Dispatcher::getInstance().removeHandler(id);
+}
+
+inline void dispatch(const std::string& message, const Notification* param = 0)
+{
+       Dispatcher::getInstance().dispatch(message, param);
+}
+
+} // namespace dispatcher
+
+
 } // namespace Mf
 
 #endif // _MOOF_DISPATCHER_HH_
This page took 0.018147 seconds and 4 git commands to generate.