Le corps, affecté par SetGenerateNextEvent, génére un nouvel événement à partir de celui qui est en cours d'exécution, avant de l'insérer dans l'agenda. Le nouvel événement est d'une classe différente ou de la même classe, selon qu'une invocation de SetNextEventClassName a été faite ou non lors de la construction. Par défaut d'un tel appel, les deux noms de classe sont les mêmes.bool pingEvent_generateNextEvent_Body(EventMethod* pM) { bool succeed = TRUE; Event* pCurrentEvent = pM->DescribedEvent(); ... Event* pNextEvent = new PongEvent(); ... pCurrentEvent->SetNextEvent(pNextEvent); ... return succeed; } PingEvent::PingEvent() : Event(PING_EVENT, "pingEvent") { ... SetGenerateNextEvent(pingEvent_generateNextEvent_Body); ... };Le constructeur GenerateNextEvent() affecte le symbole de classe GENERATE_NEXTEVENT et le nom de classe "generateNextEvent". Ainsi, on peut écrire :
int main(...) { ... Event* pEv = new PingEvent(); bool succeed; // le code ci-dessous ... Method* pM = pEv->GetMethod(GENERATE_NEXTEVENT); succeed = ((EventPredicate*)pM)->Body((EventMethod*)pM); // ... est équivalent à celui-ci succeed = pEv->ExecPredicate(GENERATE_NEXTEVENT); ... }