-#define IMPLEMENT_TRANSLATOR_LISTENER(cl, m) \
-void \
-cl :: _internal_declare_ ## m () \
-{ \
- static translator_listener_record r; \
- add_translator_listener (&listener_list_, &r, _get_ ## m ## _listener, #m); \
-} \
- \
-ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m); \
- \
-Listener \
- cl :: _get_ ## m ## _listener (void *me, SCM unused) \
-{ \
- cl *obj = (cl *) me; \
- (void) unused; \
- return obj->GET_LISTENER (_listen_scm_ ## m); \
-} \
- \
-IMPLEMENT_LISTENER (cl, _listen_scm_ ## m) \
-void \
-cl::_listen_scm_ ## m (SCM sev) \
-{ \
- Stream_event *ev = Stream_event::unsmob (sev); \
- protect_event (sev); \
- listen_ ## m (ev); \
-}
+#define ADD_LISTENER_FOR(cl, m, ev) \
+ listener_list_ = scm_acons \
+ (event_class_symbol (#ev), \
+ method_finder<&cl::listen_ ## m> (), \
+ listener_list_)
+
+#define ADD_LISTENER(cl, m) ADD_LISTENER_FOR (cl, m, m)