    (condition? thing) thing
 
    (instance? Throwable thing)
-   (make-condition (mapcat condition-components
-                           (filter identity
-                                   [(make-throwable thing)
-                                    (make-message-condition (.getMessage ^Throwable thing))
-                                    (cond
-                                     (instance? Exception thing) (make-error)
-                                     (instance? Error thing) (make-assertion-violation)
-                                     :else nil)])))
+   (let [^Throwable throwable thing]
+     (make-condition (mapcat condition-components
+                             (filter identity
+                                     [(make-throwable throwable)
+                                      (make-message-condition (.getMessage throwable))
+                                      (cond
+                                       (instance? Exception throwable) (make-error)
+                                       (instance? Error throwable) (make-assertion-violation)
+                                       :else nil)
+                                      (make-who-condition (stack-trace-who (.getStackTrace throwable)))]))))
 
    :else (clojure.core/assert (instance? Throwable thing) "not a throwable"))))
 

(defmacro condition
  [?base ?message & ?irritants]
  `(combine-conditions ~?base
                       (make-who-condition (stack-trace-who))
                       (make-message-condition ~?message)
                       (make-irritants-condition [~@?irritants]))))


  {:pre [(condition? cond)]}
  (::components (ex-data cond)))

(declare make-throwable make-error make-assertion-violation make-message-condition make-who-condition)

(defn make-condition
  "Make a condition from components.
