The Simplified MakeMaker class hierarchy **************************************** What most people need to know. (Subclasses on top.) MY | ExtUtils::MakeMaker | ExtUtils::MM_{Current OS} | ExtUtils::MM_Unix | ExtUtils::MM_Any The object actually used is of the class MY which allows you to override bits of MakeMaker inside your Makefile.PL by declaring MY::foo() methods. The Real MakeMaker class hierarchy ********************************** You wish it was that simple. Here's how it really works. PACK### (created each call to ExtUtils::MakeMaker->new) . | (mixin) | . | MY (created by ExtUtils::MY) | | | ExtUtils::MY MM (created by ExtUtils::MM) | | ExtUtils::MM | | |----------------------- | | | ExtUtils::Liblist ExtUtils::MakeMaker | | | ExtUtils::Liblist::Kid | | | | ExtUtils::MM_{Current OS} (if necessary) | ExtUtils::MM_Unix | ExtUtils::MM_Any NOTE: Yes, this is a mess. See http://archive.develooper.com/makemaker@perl.org/msg00134.html for some history. NOTE: When ExtUtils::MM is loaded it chooses a superclass for MM from amongst the ExtUtils::MM_* modules based on the current operating system. NOTE: ExtUtils::MM_{Current OS} represents one of the ExtUtils::MM_* modules except ExtUtils::MM_Any chosen based on your operating system. NOTE: The main object used by MakeMaker is a PACK### object, *not* ExtUtils::MakeMaker. It is, effectively, a subclass of MY, ExtUtils::Makemaker, ExtUtils::Liblist and ExtUtils::MM_{Current OS} NOTE: The methods in MY are simply copied into PACK### rather than MY being a superclass of PACK###. I don't remember the rationale. NOTE: ExtUtils::Liblist should be removed from the inheritence hiearchy and simply be called as functions. NOTE: Modules like File::Spec and Exporter have been omitted for clarity. The MM_* hierarchy ****************** MM_Win95 MM_NW5 \ / MM_BeOS MM_Cygwin MM_OS2 MM_VMS MM_Win32 MM_DOS MM_UWIN \ | | | / / / ------------------------------------------------ | | MM_Unix | | | MM_Any NOTE: Each direct MM_Unix subclass is also an MM_Any subclass. This is a temporary hack because MM_Unix overrides some MM_Any methods with Unix specific code. It allows the non-Unix modules to see the original MM_Any implementations. NOTE: Modules like File::Spec and Exporter have been omitted for clarity.