     expr))
 
 (defmacro enqueue
-  [queue data enqueued-counter dropped-counter]
+  [obj data enqueued-counter dropped-counter]
   (println "Enqueueing data via:")
-  (let [expr (condp (fn [^String v ^String s] (.contains s v)) queue-setup
+  (let [queue (with-meta obj {:tag 'java.util.concurrent.BlockingQueue})
+        expr (condp (fn [^String v ^String s] (.contains s v)) queue-setup
                "add-counted-yield" `(if (< (.size ~queue) queue-size)
                                       (do
                                         (.add ~queue ~data)

    expr))

(defmacro take-from-queue
  [queue]
  (println "Retrieving data from queue via:")
  (let [expr (condp (fn [^String v ^String s] (.endsWith s v)) queue-setup
               "remove-yield" `(if (not (.isEmpty ~queue))
                                 (.remove ~queue)
                                 (Thread/yield))



(defn create-local-processing-element
  ([in-queue initial-proc-fn]
    (create-local-processing-element in-queue initial-proc-fn nil))
  ([in-queue initial-proc-fn id]
    (let [running (atom true)
          out-queue (create-queue)
          out-counter (Counter.)
