$ boot repl
nREPL server started on port 49856 on host 127.0.0.1 - nrepl://127.0.0.1:49856
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.7.0
boot.user=> (require '[mount.core :as mount :refer [defstate]]
'[cchange :as c])
boot.user=> (import '[cchange RestartListener])
cchange.RestartListener
boot.user=> (defstate a :start (println "starting a") :stop (println "stopping a"))
"|| mounting... #'boot.user/a"
#'boot.user/a
boot.user=> (defstate b :start (println "starting b") :stop (println "stopping b"))
"|| mounting... #'boot.user/b"
#'boot.user/b
boot.user=> (defstate c :start (println "starting c") :stop (println "stopping c"))
"|| mounting... #'boot.user/c"
#'boot.user/c
boot.user=> (defstate zoo :start (RestartListener. (atom {})))
"|| mounting... #'boot.user/zoo"
#'boot.user/zoo
boot.user=> (mount/start #'boot.user/zoo)
{:started ["#'boot.user/zoo"]}
boot.user=> (c/add-watcher zoo #{:foo :bar} #'boot.user/a)
boot.user=> (c/add-watcher zoo #{:baz :bam} #'boot.user/b)
boot.user=> (c/add-watcher zoo #{:baz :woo :moo} #'boot.user/c)
boot.user=> (c/on-change zoo :foo)
starting a
{:started ["#'boot.user/a"]}
boot.user=> (c/on-change zoo :foo)
stopping a
starting a
{:started ["#'boot.user/a"]}
boot.user=> (c/on-change zoo :bar)
stopping a
starting a
{:started ["#'boot.user/a"]}
boot.user=> (c/on-change zoo :woo)
starting c
{:started ["#'boot.user/c"]}
boot.user=> (c/on-change zoo :woo)
stopping c
starting c
{:started ["#'boot.user/c"]}
boot.user=> (c/on-change zoo :moo)
stopping c
starting c
{:started ["#'boot.user/c"]}
boot.user=> (c/on-change zoo :baz)
stopping c
starting b
starting c
{:started ["#'boot.user/b" "#'boot.user/c"]}
boot.user=> (c/on-change zoo :baz)
stopping c
stopping b
starting b
starting c
{:started ["#'boot.user/b" "#'boot.user/c"]}