The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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.