+ template<class K, void (K::*method)(watcher &w, int)>
+ static void method_thunk (EV_P_ ev_watcher *w, int revents)
+ {
+ K *obj = static_cast<K *>(w->data);
+ (obj->*method) (*static_cast<watcher *>(w), 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_P_ ev_watcher *w, int revents)
+ {
+ K *obj = static_cast<K *>(w->data);
+ (static_cast<K *>(w->data)->*method) (*static_cast<watcher *>(w), revents);
+ }
+
+ template<void (*function)(watcher &w, int)>
+ void set (void *data = 0)
+ {
+ set_ (data, function_thunk<function>);
+ }
+
+ template<void (*function)(watcher &w, int)>
+ static void function_thunk (EV_P_ ev_watcher *w, int revents)
+ {
+ function (*static_cast<watcher *>(w), revents);
+ }
+
+ void operator ()(int events = EV_UNDEF)
+ {
+ return ev_cb (static_cast<ev_watcher *>(this))
+ (static_cast<ev_watcher *>(this), events);
+ }
+
+ bool is_active () const
+ {
+ return ev_is_active (static_cast<const ev_watcher *>(this));
+ }
+
+ bool is_pending () const
+ {
+ return ev_is_pending (static_cast<const ev_watcher *>(this));
+ }
+ };