       (count [_]
         (count types))
 
-      ISpecType
-      (tag [_] :static)
-
       IStaticSize
       (size [_]
         (reduce #(+ %1 (proto/size %2)) 0 types))
 
-      IReadableSpec
+      ISpec
       (read [_ buff pos]
         (loop [index pos result {} pairs data]
           (if-let [[fieldname type] (first pairs)]

      (cond
        (and (even? numparams)
             (keyword? (first params))
             (satisfies? ISpecType (second params)))
        :associative

        (every? #(satisfies? ISpecType %) params)
        :indexed))))

(defmethod spec :associative

                     (rest pairs)))
            [(- index pos) result])))

      (write [_ buff pos data']
        (let [written (reduce (fn [index [fieldname type]]
                                (let [value (get data' fieldname nil)
