 (defonce _root-group_ (alloc-id :node))
 
 (defn free-id
-  "Free the ID of type key. Takes an optional action-fn which it will evaluate
-  in transaction with the freeing of the id. (Evaluation happens within an agent
-  so there's no need to worry about the transaction retrying multiple times).
-  Therefore there is no possibility of interleaving concurrent freeing of ids
-  and execution of associated action-fns. Execution of action-fn is also
-  synchronised with the execution of alloc-id action-fns (they all use the same
-  agent)."
+  "Free the ID of type key. Takes an optional action-fn which it will
+   evaluate in transaction with the freeing of the id. (Evaluation
+   happens within an agent so there's no need to worry about the
+   transaction retrying multiple times).  Therefore there is no
+   possibility of interleaving concurrent freeing of ids and execution
+   of associated action-fns. Execution of action-fn is also synchronised
+   with the execution of alloc-id action-fns (they all use the same
+   agent)."
   ([k id] (free-id k id 1 nil))
   ([k id size] (free-id k id size nil))
   ([k id size action-fn]

(ns
    ^{:doc "ID allocator system. Used to return new unique integer IDs in a threadsafe manner. IDs may be freed and therefore reused. Allows action fns to be executed in synchronisation with allocation and deallocation."
      :author "Sam Aaron"}
  overtone.sc.machinery.allocator
  (:use [overtone.sc defaults]

(defonce action-fn-executor* (agent nil))

(defn- execute-action-fn
  "Execute action-fn and catch all exceptions - outputting them to the
   error log. All actions are executed in sequence."
  [action-fn caller-name]
  (send action-fn-executor* (fn [_]
                              (try
