                           :unspecified ::unspecified ;; <-- a primitive building block
                           :constant ::constant
                           :dynamic ::dynamic
+                          :dynamic ::dynamic-value
                           :dynamic symbol?))
 
 (def pair-vec {:default-parent [nil nil]})

(spec/def ::unspecified nil?)

(spec/def ::dynamic (partial = :dynamic))

(defn value-or-type [type-tag value-tester?]
  (spec/or :type (partial = type-tag)

                               {:key :b, :value-type [:visited [:long [:value 2]]]} 
                               {:key :c, :value-type [:visited [:long [:value 3]]]})}]))

(defn strip-data [x]
  (visit-primitives 
   x (fn [primitive]
       (let [t (access/getx type-head primitive)]
         [t [:type t]]))))
(assert (= (strip-data (spec/conform ::type [:vecdata 1 2 3 4]))
           [:vec {:type :vecdata, 
                  :data '([:long [:type :long]] 
                          [:long [:type :long]] 
                          [:long [:type :long]] 
                          [:long [:type :long]])}]))

(def get-type-head (access/getter type-head))
(def get-type-body (access/getter type-body))

(defn vec-body? [x]
  (and (map? x)
