For future reference these are some API design ideas- not working code! -------------------------------------------------------------------------------- Java API ideas -------------------------------------------------------------------------------- http://www.ioplex.com/~miallen/encdec/ (binary pack/unpack utilities) The Java API would take an object, and a list of field names, then use the Java Reflection API to read or write those fields during packing and unpacking. I.e. if you are going to unpack a tpl with format string A(if), you might create a Java class that has two instance variables (an int and a double). Then you create an object of that class, and pass it to tpl_map (or perhaps a constructor for the Tpl class), like class Unpacker { int count; double weight; } ... Unpacker up = new Unpacker(); Tpl tn = new Tpl("A(if)", up, "count", "weight"); tn.tpl_unpack(1); // stores unpacked values into count,weight using Reflection -------------------------------------------------------------------------------- Ruby API ideas -------------------------------------------------------------------------------- #!/usr/local/ruby/bin/ruby -w class Tpl < Hash def initialize(fmt, *args) @fmt = fmt @args = args end def pack @args.each {|key| puts "#{key} #{self[key]}"} end end p = Tpl.new("A(i)", :id); 10.times do |i| p[:id] = i p.pack end p.dump("/tmp/file.tpl") # p.dump(arg) checks arg.respond_to?(:write) p = Tpl.new("A(i)", :id); p.load("/tmp/file.tpl") p.unpack(1) {|h| puts h[:id]}