                 (or (lookup child path' params)
                     (lookup ?wild path' params)
                     (lookup ?catch path' params))))
-            (assoc params param path))))
+            (->Match data (assoc params param path)))))
       (get-segment [this]
         segment)
       (add-child [this key child]
-        (wild-node segment param (assoc children key child)))
+        (wild-node segment param (assoc children key child) data))
       (insert-child [this key path-spec o]
-        (wild-node segment param (update children key insert path-spec o))))))
-
-(defn catch-all-node [segment children param]
+        (wild-node segment param (update children key insert path-spec o) data)))))
+
+(defn catch-all-node [segment children param data]
   (reify
     Node
     (lookup [this path params]
-      (assoc params param path))
+      (->Match data (assoc params param path)))
     (get-segment [this]
       segment)))
 
-(defn static-node [^String segment children]
+(defn static-node [^String segment children data]
   (let [size (count segment)
         ?wild (maybe-wild-node children)
         ?catch (maybe-catch-all-node children)

  ;; 1.3ms (dissoc wild & catch-all from children)
  ;; 1.3ms (reified protocols)
  ;; 0.8ms (flattened matching)
  (cc/quick-bench (dotimes [_ 1000] (lookup tree-new "/v1/orgs/1/topics" {}))))

  (lookup [_ _ _])
  (get-segment [this]))

(defrecord Match [data params])

(defn wild-node [segment param children data]
  (let [?wild (maybe-wild-node children)
        ?catch (maybe-catch-all-node children)
        children' (impl/fast-map children)]
