           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)
+  (let [{:keys [^PrintService printer
+                ^PrintJobListener listener
+                docs attrs]} spec]
+    (if (and (every? (fn [d] (valid-attrs? d :doc)) (map :attrs 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)))}))))
+      (letfn [(add-doc [doc-map]
+                (assoc-in doc-map [:obj] (delay (make-doc doc-map))))
+              (add-docs [m]
+                (update-in m [:docs] (fn [doc-list] (map add-doc  doc-list))))
+              (add-jobs [m]
+                (assoc-in m [:jobs] (for [d docs] (.. printer createPrintJob))))]
+        (-> spec add-docs add-jobs)))))
 
 ;; (defn make-job
 ;;   "Returns a JobSpec map that is the result of

      :request (HashPrintRequestAttributeSet. (into-array PrintRequestAttribute s))
      nil)))

(defn- make-doc
  "Returns a javax.print.Doc object for the print data in this
   job map. SimpleDoc will throw an IllegalArgumentException if

  (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))) ;; TODO: reflection
  ;; (add-listener [this listener]
  ;;   (if-let [{^DocPrintJob job :job} this]
  ;;     (do (doto job (.addPrintJobListener listener))
