The current CPAN toolchain is broken.
Not in a "but it works for me just fine" and "users should upgrade" world it isn't. Competent users are doing just fine. It's the incompetent users we have a problem with.
If you want a demonstration, get a computer with a fresh untouched install of a 5-year old Perl and try to install anything of note by just doing 'sudo -H cpan -i Module'. It will almost certainly crash.
And if we ever want anyone that doesn't know Perl (who are by definition not competent with Perl) to install a Perl-based application from CPAN, we need to fix that.
Ironically, most of the things that are broken can be fixed easily, it's just that they involve multiple toolchain components, and the toolchain authors aren't as effective as they could and should be be about co-ordination.
So I'll be trying to get some of these fixed over the next little while, with a view to having a CPAN toolchain that doesn't suck ready for 5.10.1, the first long-term production release of Perl 5.10.
The first step in fixing this is really to get my (adopted) house in order and try to make Module::Install play well with others a bit better.
One of the problems has been that Module::Install contains Module::AutoInstall. This piece of embedded mitochondrial functionality will allow your Makefile.PL to launch a CPAN client inside itself to fulfil dependencies, IF AND ONLY IF it is not already running underneath a CPAN client.
Except it often doesn't work, because Module::Install has no reliable way to tell if it is being run underneath a CPAN client or being run by hand.
The CPAN.pm-detection uses an unreliable lockfile, and the CPANPLUS detection uses an environment variable PERL5_CPANPLUS_IS_RUNNING that lies. It doesn't actually mean that CPANPLUS is running, it just means that CPANPLUS is loaded.
Inside of Module::Install, I've been working on a new experimental Module::Install::With package that contains all the functions used for determining the environment Module::Install is running in.
Now this finally has a reliable way of detecting CPANPLUS. As of the most recent devel release of CPANPLUS, it now will additionally set the environment version PERL5_CPANPLUS_IS_EXECUTING to be the rel2abs path of the Makefile.PL it is running.
In this way, Module::Install can now detect not only that CPANPLUS is running, but that it is running ME and isn't around for some other reason. The next developer release will also (for future-proofing sake) add PERL5_CPANPLUS_IS_VERSION so that Module::Install can know what version of CPANPLUS is running, in case it has to implement some sort of workaround far in the future.
Unfortunately, CPAN isn't quite up with the game yet.
Due to that whole "not communicating enough" problem, the latest developer release of CPAN now for some strange reason sets PERL5_CPANPLUS_IS_RUNNING when calling Makefile.PL... which just won't do at all.
But before the next full CPAN release we should have that fixed, and it will instead set PERL5_CPAN_IS_EXECUTING and PERL5_CPAN_IS_VERSION in a similar way.