Wormhole Example ================ An example of using the wormhole aspect. Shows how the design degrades when a feature is added, and how refactoring to aspects improves the design. before.pl - the initial design. Our company prints documents. We have the classes Printer, SpamPrintJob, and SpamDocument. To print a job you create it, create a Printer, and call $printer->print($job). The call flow will be: Printer::print SpamPrintJob::spool SpamDocument::spool All is well: the design is nice and clean, and allows us to create a hierarchy of classes for different jobs and documents. after_oop.pl - we are told the company has purchased several new printers. This means that SpamDocument::spool must get the name of the printer from somewhere. And it must be the name of the printer that is currently printing this document. So we append the Printer object to the argument list of each method in the call flow. SpamPrintJob now suffers from EEK. after_aop.pl - to remove EEK we refactor to use the Wormhole aspect. SpamPrintJob now knows nothing of the fact that we have several printers. In fact, the code is exactly like before.pl, except for these changes: * added to Printer instance data for name support * added a wormhole aspect * appended a Printer argument to SpamDocument::spool