Doing virtual classes the right way
diff --git a/wireshark_gen/templates/_ofclass_dissector.lua b/wireshark_gen/templates/_ofclass_dissector.lua
index fbb9f6a..d9fb5cb 100644
--- a/wireshark_gen/templates/_ofclass_dissector.lua
+++ b/wireshark_gen/templates/_ofclass_dissector.lua
@@ -26,7 +26,7 @@
 :: # under the EPL.
 ::
 :: from loxi_ir import *
-:: from wireshark_gen import make_field_name, get_reader, get_peeker
+:: from wireshark_gen import make_field_name, get_reader
 :: attrs = []
 :: if ofclass.virtual: attrs.append("virtual")
 :: if ofclass.superclass: attrs.append("child")
@@ -43,18 +43,25 @@
 :: if ofclass.virtual:
 :: discriminator_name = make_field_name(version, ofclass.name, ofclass.discriminator.name)
 :: #endif
+:: offset = 0
 :: for m in ofclass.members:
 :: if isinstance(m, OFPadMember):
+:: if not ofclass.virtual:
     reader.skip(${m.length})
+:: #endif
 :: continue
 :: #endif
 :: field_name = make_field_name(version, ofclass.name, m.name)
 :: reader_name = get_reader(version, ofclass, m)
-:: peeker_name = get_peeker(version, ofclass, m)
+:: if ofclass.virtual:
+:: var_len = m.length
 :: if (field_name == discriminator_name):
-    return ${peeker_name}(reader, ${version.wire_version}, subtree, '${field_name}')
+    return ${ofclass.name}_v${version.wire_version}_dissectors[reader.peek(${offset},${var_len}):uint()](reader, subtree)
 ::    break
 :: else:
+:: offset = offset + var_len
+:: #endif
+:: else:
     ${reader_name}(reader, ${version.wire_version}, subtree, '${field_name}')
 :: #endif
 :: #endfor