   (submit [this]
     (let [{:keys [docs jobs]} this
           doc-objs (map :obj docs)]
-      (map (fn [d j] (.. j (print @d (make-set attrs :request)))) doc-objs jobs)))
+      (map (fn [d j] (.. j (print @d (make-set attrs :request)))) doc-objs jobs))) ;; TODO: reflection
   ;; (add-listener [this listener]
   ;;   (if-let [{^DocPrintJob job :job} this]
   ;;     (do (doto job (.addPrintJobListener listener))

          maybe-listen))))

(defmethod make-job :docs [spec]
  (let [{docs :docs} spec
        {:keys [doc ^PrintService printer attrs ^PrintJobtListener listener]
         :or {printer (printer :default)
              attrs #{MediaTray/MAIN}}} spec
              maybe-listen #(if listener (add-listener % listener) %)]
    (if (and (every? #(valid-attrs? (:attrs %) :doc) docs)
             (valid-attrs? attrs :job))
      (map->MultiJobSpec {:docs (map #(assoc % :obj (make-doc %)) docs)
                          :printer printer
                          :attrs attrs
                          :jobs (map maybe-listen
                                     (for [d docs]
                                       (.. printer createPrintJob)))}))))

;; (defn make-job
;;   "Returns a JobSpec map that is the result of

         :or {printer (printer :default)
              attrs #{MediaTray/MAIN}}} spec
              maybe-listen #(if listener (add-listener % listener) %)]
    (if  (and (valid-attrs? doc-attrs :doc)
             (valid-attrs? attrs :job))
      (-> (map->JobSpec {:doc doc
                         :printer printer
