           (bytes/zeropad! tmpbuf length))
 
         (buffer/write-bytes buff pos size tmpbuf)
-        size))
-
-    IStaticSize
-    (size [_] size)))
+        size))))
 
 (defn string*
-  "Arbitrary size string spec constructor."
+  "Arbitrary length string type spec constructor."
   []
   (reify
-    ISpecType
-    (tag [_] :dynamic)
-
-    IReadableSpec
+    ISpec
     (read [_ buff pos]
       (let [datasize (buffer/read-int buff pos)
             data (buffer/read-bytes buff (+ pos 4) datasize)
             data (String. data 0 datasize "UTF-8")]
         [(+ datasize 4) data]))
 
-    IWritableSpec
     (write [_ buff pos value]
       (let [input (.getBytes value "UTF-8")
             length (count input)]

    (count [_]
      (count types))

    ISpecType
    (tag [_] :static)

    IStaticSize
    (size [_]
      (reduce #(+ %1 (proto/size %2)) 0 types))

    IReadableSpec
    (read [_ buff pos]
      (loop [index pos result [] types types]
        (if-let [type (first types)]

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

    (write [_ buff pos data']
      (let [indexedtypes (map-indexed vector types)
            written (reduce (fn [pos [index type]]
