Listing 2: PersonnelHandler implements the active graph for the personnel schema.

// This class implements all facets needed to handle a personnel XML document.
class PersonnelHandler : private IXMLDocumentHandler
{
private:
   mapIDToPerson &m_people;
   std::string m_id;
   Person m_current;
   // One facet for each element type.
   FXMLElementHandler< PersonnelHandler > f_personnel;
   FXMLElementHandler< PersonnelHandler > f_person;
   FXMLElementHandler< PersonnelHandler > f_name;
   FXMLElementHandler< PersonnelHandler > f_familyName;
   FXMLElementHandler< PersonnelHandler > f_givenName;
   FXMLElementHandler< PersonnelHandler > f_email;
   FXMLElementHandler< PersonnelHandler > f_web;
   FXMLElementHandler< PersonnelHandler > f_workWeb;
   FXMLElementHandler< PersonnelHandler > f_familyWeb;
   FXMLElementHandler< PersonnelHandler > f_link;
   // Default methods shared by many facets.
   IXMLElementHandler *default_child(
      const XMLCh *const name );
   void default_start(
      AttributeList &attrs ) {}
   void default_end() {}
   void default_characters(
      const XMLCh *const chars,
      const unsigned int length) {}
   // Implementation of the document handler interface.
   IXMLElementHandler *child( const XMLCh *const name );
   void start() {}
   void end() {}
   void reset() {}
   // Methods for specific facets.
   void person_start( AttributeList &attrs );
   void person_end();
   IXMLElementHandler *personnel_child( const XMLCh *const name );
   IXMLElementHandler *person_child( const XMLCh *const name );
   IXMLElementHandler *name_child( const XMLCh *const name );
   IXMLElementHandler *web_child( const XMLCh *const name );

   void familyName_characters( const XMLCh *const chars,
      const unsigned int length);
   void givenName_characters( const XMLCh *const chars, 
     const unsigned int length);
   void email_characters( const XMLCh *const chars, 
     const unsigned int length);
   void workWeb_characters( const XMLCh *const chars,
      const unsigned int length);
   void familyWeb_characters( const XMLCh *const chars,
      const unsigned int length);
   void link_start( AttributeList &attrs );
public:
// Initialize all facets with pointers to member functions.
   PersonnelHandler( mapIDToPerson &people ) :
      m_people( people ),
      f_personnel( this, personnel_child, default_start,
         default_end, default_characters ),
      f_person( this, person_child, person_start,
         person_end, default_characters ),
      f_name( this, name_child, default_start,
         default_end, default_characters ),
      f_familyName( this, default_child, default_start,
         default_end, familyName_characters ),
      f_givenName( this, default_child, default_start,
         default_end, givenName_characters ),
      f_email( this, default_child, default_start,
         default_end, email_characters ),
      f_web( this, web_child, default_start,
         default_end, default_characters ),
      f_workWeb( this, default_child, default_start,
         default_end, workWeb_characters ),
      f_familyWeb( this, default_child, default_start,
         default_end, familyWeb_characters ),
      f_link( this, default_child, link_start,
         default_end, default_characters )
      {}
   void parse( const char * const systemID );
};
void PersonnelHandler::parse( const char * const systemID )
{
   XMLInterpreter interpreter( this );
   interpreter.parse( systemID );
}