Protocol.xml contains a number of "OSCAR protocol elements".
One <define> block is one OSCAR protocol elemennt.

When the module is first loaded,
Protocol.xml is parsed and two hashes are created,
one whose keys are the names the the elements and whose values are the contents of the XML::Parser tree which represents the contents of those elements; the other hash has a family/subtype tuple as a key and element names as a value.

To do something with an element,
given its name,
Net::OSCAR calls protoparse("element name").
This returns a Net::OSCAR::XML::Template object,
which has pack and unpack methods.
pack takes a hash and returns a string of binary characters,
and unpack goes the other way around.
The objects are cached,
so protoparse only has to do actual work once for every protocol element.