 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defn bool
-  "Create a boolean data type."
+  "Boolean type spec constructor."
   ([] (bool nil))
   ([default]
    (reify
-     ISpecType
-     (tag [_] :static)
-
-     IReadableSpec
+     IStaticSize
+     (size [_] 1)
+
+     ISpec
      (read [_ buff pos]
        (let [readed (buffer/read-byte buff pos)]
          [1 (condp = readed

    (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]]
