                   (filter #(not (contains? active %))
                           (reverse contexts))))))))
 
-(deftype SimpleAssertion [pred] :as this
-  TestInvokable
-    (invoke-test [active]
-      (try
-        (if (pred)
-          (TestPassed this nil)
-          (TestFailed this nil))
-        (catch Throwable t
-          (TestThrown this nil t)))))
+
+;;; Container types
 
 (deftype SimpleContainer [children] :as this
   TestInvokable

     (TestResults this (map #(invoke-test % active) children))
     (catch Throwable t
       (TestThrown this active t)))))

(defn- has-after?
  "True if Context c or any of its parents has an :after function."
  [c]
  (or (:after c)
      (some has-after? (:parents c))))

(deftype ContextualContainer [contexts children] :as this
  TestInvokable

                (filter #(not (contains? active %))
                        (reverse contexts))))))))


;;; Public API

(defmacro should
  "A series of assertions.  Each assertion is a simple expression,
  which will be compiled into a function.  A string will be attached
  as :doc metadata on the following assertion."
  [& assertions]
  (loop [r [], as assertions]
    (if (seq as)
      (let [[doc form nxt]
