     `(defrecord ~name [~'processfn ~'ch-in ~'ch-out     ;; constructor-initialized fields
                        ]                                ;; start/stop-initialized fields
 
+       MessageRouting
+
+       (pass-on [this# req#]
+         (debug "routing message...")
+         (put! ~'ch-out req#))
+
        c/Lifecycle
 
        (start [~this1]

            [clojure.core.async :refer [put! >! >!! <! <!! go go-loop pub sub chan close! timeout alts!! promise-chan]]
            [taoensso.timbre :refer [trace debug info warn error fatal]]))

(defn safe-process [this f req & args]
  (try
    (apply f this req args)

                         (debug "sending response(s)")
                         (cond
                           (nil? res#)        nil
                           (sequential? res#) (dorun (map #(pass-on ~this1 %) res#))
                           true               (pass-on ~this1 res#)))))
                 (recur (<! ~'ch-in)))
             (info "stopped.")))
         (let [~this1 ~(if startfn
