+ base ()
+ {
+ ev_init (this, 0);
+ }
+
+ void set_ (void *object, void (*cb)(ev_watcher *w, int revents))
+ {
+ this->data = object;
+ ev_set_cb (static_cast<ev_watcher *>(this), cb);
+ }
+
+ template<class K, void (K::*method)(watcher &w, int)>
+ void set (K *object)
+ {
+ set_ (object, method_thunk<K, method>);
+ }
+
+ template<class K, void (K::*method)(watcher &w, int)>
+ static void method_thunk (ev_watcher *w, int revents)
+ {
+ watcher *self = static_cast<watcher *>(w);
+ K *obj = static_cast<K *>(self->data);
+ (obj->*method) (*self, revents);
+ }
+
+ template<class K, void (K::*method)(watcher &w, int) const>
+ void set (const K *object)
+ {
+ set_ (object, const_method_thunk<K, method>);
+ }
+
+ template<class K, void (K::*method)(watcher &w, int) const>
+ static void const_method_thunk (ev_watcher *w, int revents)
+ {
+ watcher *self = static_cast<watcher *>(w);
+ K *obj = static_cast<K *>(self->data);
+ (obj->*method) (*self, revents);
+ }
+
+ template<void (*function)(watcher &w, int)>
+ void set ()
+ {
+ set_ (0, function_thunk<function>);
+ }
+
+ template<void (*function)(watcher &w, int)>
+ static void function_thunk (ev_watcher *w, int revents)
+ {
+ watcher *self = static_cast<watcher *>(w);
+ function (*self, revents);
+ }
+
+ void operator ()(int events = EV_UNDEF)