Oh, I see, so module almost serves purpose of an abstract class.  Can
instance variables be assigned in self.new which are then carried into
TypeB without explicitly passing them?  I think that may be done in
Lisp with-slots of the abstract class.  mmap is convenient and acts as
a global variable to permit access to previously read  numbers while
deep in the parser.  Wouldn't it look nicer to simply fill the slots in
the abstract class with the numbers in the header while you have them,
more like

module Type
     def self.new buf
       @version = parse_byte buf      # save some header info, alas,
invisible to TypeA
       byte = parse_byte buf
       case byte
         when 0
           TypeA.new buf
         when 1
           TypeB.new buf
       end
     end
end

And have TypeA or TypeB inherit those slots that are already filled.
Alas, the final instance can't see @version.  Sure you can pass the
data into the instantiation or use mmap, but it seems cleaner if you
could simply bind it in the abstract header class where it naturally
belongs.

Kind regards, Bob Anderson
PS.  I admire your Ruby work and writings!