/-----------\ | Company | \-----------/ / \ / \ /-----------\ /-------------------\ | AcmeLtd | | Company::Division | \-----------/ \-------------------/ \ / \ / /-------------\ | AcmeLtd::IT | \-------------/ #### Company->new->run \/ (inside Company::run) create new instance of AcmeLtd. use this to a) get name of AcmeLtd subclass that should process the data, and create an instance of this class or b) get an instance of the AcmeLtd subclass that should process the data \/ (inside Company::run) call the processing method of the object instantiated above #### Company->new->run \/ (inside Company::run) AcmeLtd->new->run \/ (inside AcmeLtd::run) AcmeLtd::IT->new->run #### Company->new->run \/ (inside Company::run) rebless Company object as AcmeLtd, and alter @ISA appropriately \/ (inside same, reblessed object) use newly available methods to get the name of the AcmeLtd subclass that should process the data, then rebless ourselves again into this new class and alter @ISA again \/ (inside same, reblessed object) call newly available processing method