Update CPAN.pm to 1.93_51
authorAndreas Koenig <(none)>
Thu, 12 Feb 2009 04:44:17 +0000 (05:44 +0100)
committerDavid Mitchell <davem@iabyn.com>
Tue, 26 May 2009 21:32:48 +0000 (22:32 +0100)
(cherry picked from commit f9916dde008ce6af3907ba5f9be19340d8dba6de)

25 files changed:
MANIFEST
lib/CPAN.pm
lib/CPAN/Author.pm [new file with mode: 0644]
lib/CPAN/Bundle.pm [new file with mode: 0644]
lib/CPAN/CacheMgr.pm [new file with mode: 0644]
lib/CPAN/Complete.pm [new file with mode: 0644]
lib/CPAN/DeferredCode.pm [new file with mode: 0644]
lib/CPAN/Distribution.pm [new file with mode: 0644]
lib/CPAN/Distroprefs.pm
lib/CPAN/Distrostatus.pm [new file with mode: 0644]
lib/CPAN/Exception/RecursiveDependency.pm [new file with mode: 0644]
lib/CPAN/Exception/yaml_not_installed.pm [new file with mode: 0644]
lib/CPAN/FTP.pm [new file with mode: 0644]
lib/CPAN/FTP/netrc.pm [new file with mode: 0644]
lib/CPAN/FirstTime.pm
lib/CPAN/HandleConfig.pm
lib/CPAN/Index.pm [new file with mode: 0644]
lib/CPAN/InfoObj.pm [new file with mode: 0644]
lib/CPAN/LWP/UserAgent.pm [new file with mode: 0644]
lib/CPAN/Module.pm [new file with mode: 0644]
lib/CPAN/Prompt.pm [new file with mode: 0644]
lib/CPAN/Shell.pm [new file with mode: 0644]
lib/CPAN/Tarzip.pm
lib/CPAN/URL.pm [new file with mode: 0644]
lib/CPAN/t/03pkgs.t

index 46906df..eea5853 100755 (executable)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1929,15 +1929,29 @@ lib/constant.pm                 For "use constant"
 lib/constant.t                 See if compile-time constants work
 lib/CORE.pod                   document the CORE namespace
 lib/CPAN/API/HOWTO.pod         recipe book for programming with CPAN.pm
+lib/CPAN/Author.pm
 lib/CPAN/bin/cpan              easily interact with CPAN from the command line
+lib/CPAN/Bundle.pm
+lib/CPAN/CacheMgr.pm
+lib/CPAN/Complete.pm
 lib/CPAN/Debug.pm              helper package for CPAN.pm
 lib/CPAN/DeferedCode.pm                helper package for CPAN.pm
+lib/CPAN/DeferredCode.pm
+lib/CPAN/Distribution.pm
 lib/CPAN/Distroprefs.pm                helper package for CPAN.pm
+lib/CPAN/Distrostatus.pm
+lib/CPAN/Exception/
 lib/CPAN/FirstTime.pm          Utility for creating CPAN config files
+lib/CPAN/FTP/
+lib/CPAN/FTP.pm
 lib/CPAN/HandleConfig.pm       helper package for CPAN.pm
+lib/CPAN/Index.pm
+lib/CPAN/InfoObj.pm
 lib/CPAN/Kwalify/distroprefs.dd                helper file for validating config files
 lib/CPAN/Kwalify/distroprefs.yml       helper file for validating config files
 lib/CPAN/Kwalify.pm            helper package for CPAN.pm
+lib/CPAN/LWP/
+lib/CPAN/Module.pm
 lib/CPAN/Nox.pm                        Runs CPAN while avoiding compiled extensions
 lib/CPAN/PAUSE2003.pub         CPAN public key
 lib/CPAN/PAUSE2005.pub         CPAN public key
@@ -2039,7 +2053,9 @@ lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed        CPANPLUS test
 lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed     CPANPLUS tests
 lib/CPANPLUS/t/inc/conf.pl     CPANPLUS tests
 lib/CPAN.pm                    Interface to Comprehensive Perl Archive Network
+lib/CPAN/Prompt.pm
 lib/CPAN/Queue.pm              queueing system for CPAN.pm
+lib/CPAN/Shell.pm
 lib/CPAN/SIGNATURE             CPAN public key
 lib/CPAN/t/01loadme.t          See if CPAN the module works
 lib/CPAN/t/02nox.t             See if CPAN::Nox works
@@ -2047,6 +2063,7 @@ lib/CPAN/t/03pkgs.t               See if CPAN::Version works
 lib/CPAN/t/10version.t         See if CPAN the module works
 lib/CPAN/t/11mirroredby.t              See if CPAN::Mirrored::By works
 lib/CPAN/Tarzip.pm             helper package for CPAN.pm
+lib/CPAN/URL.pm
 lib/CPAN/Version.pm            Simple math with different flavors of version strings
 lib/ctime.pl                   A ctime workalike
 lib/Cwd.pm                     Various cwd routines (getcwd, fastcwd, chdir)
index 87ecc36..9b5e0b3 100644 (file)
@@ -2,7 +2,7 @@
 # vim: ts=4 sts=4 sw=4:
 use strict;
 package CPAN;
-$CPAN::VERSION = '1.93_03'; # make the _03 a dev release and release it as 1.9304 after merge into blead
+$CPAN::VERSION = '1.93_51';
 $CPAN::VERSION =~ s/_//;
 
 # we need to run chdir all over and we would get at wrong libraries
@@ -15,12 +15,29 @@ BEGIN {
         }
     }
 }
+use CPAN::Author;
 use CPAN::HandleConfig;
 use CPAN::Version;
+use CPAN::Bundle;
+use CPAN::CacheMgr;
+use CPAN::Complete;
 use CPAN::Debug;
+use CPAN::Distribution;
+use CPAN::Distrostatus;
+use CPAN::FTP;
+use CPAN::Index;
+use CPAN::InfoObj;
+use CPAN::Module;
+use CPAN::Prompt;
+use CPAN::URL;
 use CPAN::Queue;
 use CPAN::Tarzip;
-use CPAN::DeferedCode;
+use CPAN::DeferredCode;
+use CPAN::Shell;
+use CPAN::LWP::UserAgent;
+use CPAN::Exception::RecursiveDependency;
+use CPAN::Exception::yaml_not_installed;
+
 use Carp ();
 use Config ();
 use Cwd qw(chdir);
@@ -43,14 +60,15 @@ use Text::Wrap ();
 # protect against "called too early"
 sub find_perl ();
 sub anycwd ();
+sub _uniq;
 
 no lib ".";
 
 require Mac::BuildTools if $^O eq 'MacOS';
 if ($ENV{PERL5_CPAN_IS_RUNNING} && $$ != $ENV{PERL5_CPAN_IS_RUNNING}) {
     $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} ||= $ENV{PERL5_CPAN_IS_RUNNING};
-    my $rec = $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} .= ",$$";
-    my @rec = split /,/, $rec;
+    my @rec = _uniq split(/,/, $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION}), $$;
+    $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} = join ",", @rec;
     # warn "# Note: Recursive call of CPAN.pm detected\n";
     my $w = sprintf "# Note: CPAN.pm is running in process %d now", pop @rec;
     my %sleep = (
@@ -88,7 +106,7 @@ unless (@CPAN::Defaultsites) {
         CPAN::URL->new(TEXT => $_, FROM => "DEF")
     }
         "http://www.perl.org/CPAN/",
-            "ftp://ftp.perl.org/pub/CPAN/";
+        "ftp://ftp.perl.org/pub/CPAN/";
 }
 # $CPAN::iCwd (i for initial)
 $CPAN::iCwd ||= CPAN::anycwd();
@@ -159,7 +177,7 @@ sub soft_chdir_with_alternatives ($);
     $autoload_recursion ||= 0;
 
     #-> sub CPAN::AUTOLOAD ;
-    sub AUTOLOAD {
+    sub AUTOLOAD { ## no critic
         $autoload_recursion++;
         my($l) = $AUTOLOAD;
         $l =~ s/.*:://;
@@ -227,6 +245,12 @@ sub soft_chdir_with_alternatives ($);
     }
 }
 
+sub _uniq {
+    my(@list) = @_;
+    my %seen;
+    return map { !$seen{$_} } @list;
+}
+
 #-> sub CPAN::shell ;
 sub shell {
     my($self) = @_;
@@ -596,420 +620,6 @@ sub _init_sqlite () {
     }
 }
 
-package CPAN::CacheMgr;
-use strict;
-@CPAN::CacheMgr::ISA = qw(CPAN::InfoObj CPAN);
-use Cwd qw(chdir);
-use File::Find;
-
-package CPAN::FTP;
-use strict;
-use Fcntl qw(:flock);
-use vars qw($connect_to_internet_ok $Ua $Thesite $ThesiteURL $Themethod);
-@CPAN::FTP::ISA = qw(CPAN::Debug);
-
-package CPAN::LWP::UserAgent;
-use strict;
-use vars qw(@ISA $USER $PASSWD $SETUPDONE);
-# we delay requiring LWP::UserAgent and setting up inheritance until we need it
-
-package CPAN::Complete;
-use strict;
-@CPAN::Complete::ISA = qw(CPAN::Debug);
-# Q: where is the "How do I add a new command" HOWTO?
-# A: svn diff -r 1048:1049 where andk added the report command
-@CPAN::Complete::COMMANDS = sort qw(
-                                    ? ! a b d h i m o q r u
-                                    autobundle
-                                    bye
-                                    clean
-                                    cvs_import
-                                    dump
-                                    exit
-                                    failed
-                                    force
-                                    fforce
-                                    hosts
-                                    install
-                                    install_tested
-                                    is_tested
-                                    look
-                                    ls
-                                    make
-                                    mkmyconfig
-                                    notest
-                                    perldoc
-                                    quit
-                                    readme
-                                    recent
-                                    recompile
-                                    reload
-                                    report
-                                    reports
-                                    scripts
-                                    smoke
-                                    test
-                                    upgrade
-);
-
-package CPAN::Index;
-use strict;
-use vars qw($LAST_TIME $DATE_OF_02 $DATE_OF_03 $HAVE_REANIMATED);
-@CPAN::Index::ISA = qw(CPAN::Debug);
-$LAST_TIME ||= 0;
-$DATE_OF_03 ||= 0;
-# use constant PROTOCOL => "2.0"; # outcommented to avoid warning on upgrade from 1.57
-sub PROTOCOL { 2.0 }
-
-package CPAN::InfoObj;
-use strict;
-@CPAN::InfoObj::ISA = qw(CPAN::Debug);
-
-package CPAN::Author;
-use strict;
-@CPAN::Author::ISA = qw(CPAN::InfoObj);
-
-package CPAN::Distribution;
-use strict;
-@CPAN::Distribution::ISA = qw(CPAN::InfoObj);
-
-package CPAN::Bundle;
-use strict;
-@CPAN::Bundle::ISA = qw(CPAN::Module);
-
-package CPAN::Module;
-use strict;
-@CPAN::Module::ISA = qw(CPAN::InfoObj);
-
-package CPAN::Exception::RecursiveDependency;
-use strict;
-use overload '""' => "as_string";
-
-# a module sees its distribution (no version)
-# a distribution sees its prereqs (which are module names) (usually with versions)
-# a bundle sees its module names and/or its distributions (no version)
-
-sub new {
-    my($class) = shift;
-    my($deps) = shift;
-    my (@deps,%seen,$loop_starts_with);
-  DCHAIN: for my $dep (@$deps) {
-        push @deps, {name => $dep, display_as => $dep};
-        if ($seen{$dep}++) {
-            $loop_starts_with = $dep;
-            last DCHAIN;
-        }
-    }
-    my $in_loop = 0;
-    for my $i (0..$#deps) {
-        my $x = $deps[$i]{name};
-        $in_loop ||= $x eq $loop_starts_with;
-        my $xo = CPAN::Shell->expandany($x) or next;
-        if ($xo->isa("CPAN::Module")) {
-            my $have = $xo->inst_version || "N/A";
-            my($want,$d,$want_type);
-            if ($i>0 and $d = $deps[$i-1]{name}) {
-                my $do = CPAN::Shell->expandany($d);
-                $want = $do->{prereq_pm}{requires}{$x};
-                if (defined $want) {
-                    $want_type = "requires: ";
-                } else {
-                    $want = $do->{prereq_pm}{build_requires}{$x};
-                    if (defined $want) {
-                        $want_type = "build_requires: ";
-                    } else {
-                        $want_type = "unknown status";
-                        $want = "???";
-                    }
-                }
-            } else {
-                $want = $xo->cpan_version;
-                $want_type = "want: ";
-            }
-            $deps[$i]{have} = $have;
-            $deps[$i]{want_type} = $want_type;
-            $deps[$i]{want} = $want;
-            $deps[$i]{display_as} = "$x (have: $have; $want_type$want)";
-        } elsif ($xo->isa("CPAN::Distribution")) {
-            $deps[$i]{display_as} = $xo->pretty_id;
-            if ($in_loop) {
-                $xo->{make} = CPAN::Distrostatus->new("NO cannot resolve circular dependency");
-            } else {
-                $xo->{make} = CPAN::Distrostatus->new("NO one dependency ($loop_starts_with) is a circular dependency");
-            }
-            $xo->store_persistent_state; # otherwise I will not reach
-                                         # all involved parties for
-                                         # the next session
-        }
-    }
-    bless { deps => \@deps }, $class;
-}
-
-sub as_string {
-    my($self) = shift;
-    my $ret = "\nRecursive dependency detected:\n    ";
-    $ret .= join("\n => ", map {$_->{display_as}} @{$self->{deps}});
-    $ret .= ".\nCannot resolve.\n";
-    $ret;
-}
-
-package CPAN::Exception::yaml_not_installed;
-use strict;
-use overload '""' => "as_string";
-
-sub new {
-    my($class,$module,$file,$during) = @_;
-    bless { module => $module, file => $file, during => $during }, $class;
-}
-
-sub as_string {
-    my($self) = shift;
-    "'$self->{module}' not installed, cannot $self->{during} '$self->{file}'\n";
-}
-
-package CPAN::Exception::yaml_process_error;
-use strict;
-use overload '""' => "as_string";
-
-sub new {
-    my($class,$module,$file,$during,$error) = @_;
-    # my $at = Carp::longmess(""); # XXX find something more beautiful
-    bless { module => $module,
-            file => $file,
-            during => $during,
-            error => $error,
-            # at => $at,
-          }, $class;
-}
-
-sub as_string {
-    my($self) = shift;
-    if ($self->{during}) {
-        if ($self->{file}) {
-            if ($self->{module}) {
-                if ($self->{error}) {
-                    return "Alert: While trying to '$self->{during}' YAML file\n".
-                        " '$self->{file}'\n".
-                            "with '$self->{module}' the following error was encountered:\n".
-                                "  $self->{error}\n";
-                } else {
-                    return "Alert: While trying to '$self->{during}' YAML file\n".
-                        " '$self->{file}'\n".
-                            "with '$self->{module}' some unknown error was encountered\n";
-                }
-            } else {
-                return "Alert: While trying to '$self->{during}' YAML file\n".
-                    " '$self->{file}'\n".
-                        "some unknown error was encountered\n";
-            }
-        } else {
-            return "Alert: While trying to '$self->{during}' some YAML file\n".
-                    "some unknown error was encountered\n";
-        }
-    } else {
-        return "Alert: unknown error encountered\n";
-    }
-}
-
-package CPAN::Prompt; use overload '""' => "as_string";
-use vars qw($prompt);
-$prompt = "cpan> ";
-$CPAN::CurrentCommandId ||= 0;
-sub new {
-    bless {}, shift;
-}
-sub as_string {
-    my $word = "cpan";
-    unless ($CPAN::META->{LOCK}) {
-        $word = "nolock_cpan";
-    }
-    if ($CPAN::Config->{commandnumber_in_prompt}) {
-        sprintf "$word\[%d]> ", $CPAN::CurrentCommandId;
-    } else {
-        "$word> ";
-    }
-}
-
-package CPAN::URL; use overload '""' => "as_string", fallback => 1;
-# accessors: TEXT(the url string), FROM(DEF=>defaultlist,USER=>urllist),
-# planned are things like age or quality
-sub new {
-    my($class,%args) = @_;
-    bless {
-           %args
-          }, $class;
-}
-sub as_string {
-    my($self) = @_;
-    $self->text;
-}
-sub text {
-    my($self,$set) = @_;
-    if (defined $set) {
-        $self->{TEXT} = $set;
-    }
-    $self->{TEXT};
-}
-
-package CPAN::Distrostatus;
-use overload '""' => "as_string",
-    fallback => 1;
-use vars qw($something_has_failed_at);
-sub new {
-    my($class,$arg) = @_;
-    my $failed = substr($arg,0,2) eq "NO";
-    if ($failed) {
-        $something_has_failed_at = $CPAN::CurrentCommandId;
-    }
-    bless {
-           TEXT => $arg,
-           FAILED => $failed,
-           COMMANDID => $CPAN::CurrentCommandId,
-           TIME => time,
-          }, $class;
-}
-sub something_has_just_failed () {
-    defined $something_has_failed_at &&
-        $something_has_failed_at == $CPAN::CurrentCommandId;
-}
-sub commandid { shift->{COMMANDID} }
-sub failed { shift->{FAILED} }
-sub text {
-    my($self,$set) = @_;
-    if (defined $set) {
-        $self->{TEXT} = $set;
-    }
-    $self->{TEXT};
-}
-sub as_string {
-    my($self) = @_;
-    $self->text;
-}
-
-package CPAN::Shell;
-use strict;
-use vars qw(
-            $ADVANCED_QUERY
-            $AUTOLOAD
-            $COLOR_REGISTERED
-            $Help
-            $autoload_recursion
-            $reload
-            @ISA
-            @relo
-           );
-@relo =     (
-             "CPAN.pm",
-             "CPAN/Debug.pm",
-             "CPAN/Distroprefs.pm",
-             "CPAN/FirstTime.pm",
-             "CPAN/HandleConfig.pm",
-             "CPAN/Kwalify.pm",
-             "CPAN/Queue.pm",
-             "CPAN/Reporter/Config.pm",
-             "CPAN/Reporter/History.pm",
-             "CPAN/Reporter/PrereqCheck.pm",
-             "CPAN/Reporter.pm",
-             "CPAN/SQLite.pm",
-             "CPAN/Tarzip.pm",
-             "CPAN/Version.pm",
-            );
-# record the initial timestamp for reload.
-$reload = { map {$INC{$_} ? ($_,(stat $INC{$_})[9]) : ()} @relo };
-@CPAN::Shell::ISA = qw(CPAN::Debug);
-use Cwd qw(chdir);
-$COLOR_REGISTERED ||= 0;
-$Help = {
-         '?' => \"help",
-         '!' => "eval the rest of the line as perl",
-         a => "whois author",
-         autobundle => "write inventory into a bundle file",
-         b => "info about bundle",
-         bye => \"quit",
-         clean => "clean up a distribution's build directory",
-         # cvs_import
-         d => "info about a distribution",
-         # dump
-         exit => \"quit",
-         failed => "list all failed actions within current session",
-         fforce => "redo a command from scratch",
-         force => "redo a command",
-         get => "download a distribution",
-         h => \"help",
-         help => "overview over commands; 'help ...' explains specific commands",
-         hosts => "statistics about recently used hosts",
-         i => "info about authors/bundles/distributions/modules",
-         install => "install a distribution",
-         install_tested => "install all distributions tested OK",
-         is_tested => "list all distributions tested OK",
-         look => "open a subshell in a distribution's directory",
-         ls => "list distributions according to a glob",
-         m => "info about a module",
-         make => "make/build a distribution",
-         mkmyconfig => "write current config into a CPAN/MyConfig.pm file",
-         notest => "run a (usually install) command but leave out the test phase",
-         o => "'o conf ...' for config stuff; 'o debug ...' for debugging",
-         perldoc => "try to get a manpage for a module",
-         q => \"quit",
-         quit => "leave the cpan shell",
-         r => "review over upgradeable modules",
-         readme => "display the README of a distro with a pager",
-         recent => "show recent uploads to the CPAN",
-         # recompile
-         reload => "'reload cpan' or 'reload index'",
-         report => "test a distribution and send a test report to cpantesters",
-         reports => "info about reported tests from cpantesters",
-         # scripts
-         # smoke
-         test => "test a distribution",
-         u => "display uninstalled modules",
-         upgrade => "combine 'r' command with immediate installation",
-        };
-{
-    $autoload_recursion   ||= 0;
-
-    #-> sub CPAN::Shell::AUTOLOAD ;
-    sub AUTOLOAD {
-        $autoload_recursion++;
-        my($l) = $AUTOLOAD;
-        my $class = shift(@_);
-        # warn "autoload[$l] class[$class]";
-        $l =~ s/.*:://;
-        if ($CPAN::Signal) {
-            warn "Refusing to autoload '$l' while signal pending";
-            $autoload_recursion--;
-            return;
-        }
-        if ($autoload_recursion > 1) {
-            my $fullcommand = join " ", map { "'$_'" } $l, @_;
-            warn "Refusing to autoload $fullcommand in recursion\n";
-            $autoload_recursion--;
-            return;
-        }
-        if ($l =~ /^w/) {
-            # XXX needs to be reconsidered
-            if ($CPAN::META->has_inst('CPAN::WAIT')) {
-                CPAN::WAIT->$l(@_);
-            } else {
-                $CPAN::Frontend->mywarn(qq{
-Commands starting with "w" require CPAN::WAIT to be installed.
-Please consider installing CPAN::WAIT to use the fulltext index.
-For this you just need to type
-    install CPAN::WAIT
-});
-            }
-        } else {
-            $CPAN::Frontend->mywarn(qq{Unknown shell command '$l'. }.
-                                    qq{Type ? for help.
-});
-        }
-        $autoload_recursion--;
-    }
-}
-
-package CPAN;
-use strict;
-
 $META ||= CPAN->new; # In case we re-eval ourselves we need the ||
 
 # from here on only subs.
@@ -1098,7 +708,7 @@ sub checklock {
                                            "process $otherpid.\n".
                                            "Cannot proceed.\n"));
         } elsif ($RUN_DEGRADED) {
-            $CPAN::Frontend->mywarn("Running in degraded mode (experimental)\n");
+            $CPAN::Frontend->mywarn("Running in downgraded mode (experimental)\n");
         } elsif (defined $otherpid && $otherpid) {
             return if $$ == $otherpid; # should never happen
             $CPAN::Frontend->mywarn(
@@ -1109,10 +719,10 @@ There seems to be running another CPAN process (pid $otherpid).  Contacting...
                 $CPAN::Frontend->mywarn(qq{Other job is running.\n});
                 my($ans) =
                     CPAN::Shell::colorable_makemaker_prompt
-                        (qq{Shall I try to run in degraded }.
+                        (qq{Shall I try to run in downgraded }.
                         qq{mode? (Y/n)},"y");
                 if ($ans =~ /^y/i) {
-                    $CPAN::Frontend->mywarn("Running in degraded mode (experimental).
+                    $CPAN::Frontend->mywarn("Running in downgraded mode (experimental).
 Please report if something unexpected happens\n");
                     $RUN_DEGRADED = 1;
                     for ($CPAN::Config) {
@@ -1141,7 +751,7 @@ You may want to kill the other job and delete the lockfile. On UNIX try:
                 unless $ans =~ /^y/i;
             } else {
                 Carp::croak(
-                    qq{Lockfile '$lockfile' not writeable by you. }.
+                    qq{Lockfile '$lockfile' not writable by you. }.
                     qq{Cannot proceed.\n}.
                     qq{    On UNIX try:\n}.
                     qq{    rm '$lockfile'\n}.
@@ -1457,9336 +1067,222 @@ sub has_inst {
         $CPAN::Shell::reload->{$file} = $mtime;
         my $v = eval "\$$mod\::VERSION";
         $v = $v ? " (v$v)" : "";
-        CPAN::Shell->optprint("load_module","CPAN: $mod loaded ok$v\n");
-        if ($mod eq "CPAN::WAIT") {
-            push @CPAN::Shell::ISA, 'CPAN::WAIT';
-        }
-        return 1;
-    } elsif ($mod eq "Net::FTP") {
-        $CPAN::Frontend->mywarn(qq{
-  Please, install Net::FTP as soon as possible. CPAN.pm installs it for you
-  if you just type
-      install Bundle::libnet
-
-}) unless $Have_warned->{"Net::FTP"}++;
-        $CPAN::Frontend->mysleep(3);
-    } elsif ($mod eq "Digest::SHA") {
-        if ($Have_warned->{"Digest::SHA"}++) {
-            $CPAN::Frontend->mywarn(qq{CPAN: checksum security checks disabled }.
-                                     qq{because Digest::SHA not installed.\n});
-        } else {
-            $CPAN::Frontend->mywarn(qq{
-  CPAN: checksum security checks disabled because Digest::SHA not installed.
-  Please consider installing the Digest::SHA module.
-
-});
-            $CPAN::Frontend->mysleep(2);
-        }
-    } elsif ($mod eq "Module::Signature") {
-        # NOT prefs_lookup, we are not a distro
-        my $check_sigs = $CPAN::Config->{check_sigs};
-        if (not $check_sigs) {
-            # they do not want us:-(
-        } elsif (not $Have_warned->{"Module::Signature"}++) {
-            # No point in complaining unless the user can
-            # reasonably install and use it.
-            if (eval { require Crypt::OpenPGP; 1 } ||
-                (
-                 defined $CPAN::Config->{'gpg'}
-                 &&
-                 $CPAN::Config->{'gpg'} =~ /\S/
-                )
-               ) {
-                $CPAN::Frontend->mywarn(qq{
-  CPAN: Module::Signature security checks disabled because Module::Signature
-  not installed.  Please consider installing the Module::Signature module.
-  You may also need to be able to connect over the Internet to the public
-  keyservers like pgp.mit.edu (port 11371).
-
-});
-                $CPAN::Frontend->mysleep(2);
-            }
-        }
-    } else {
-        delete $INC{$file}; # if it inc'd LWP but failed during, say, URI
-    }
-    return 0;
-}
-
-#-> sub CPAN::instance ;
-sub instance {
-    my($mgr,$class,$id) = @_;
-    CPAN::Index->reload;
-    $id ||= "";
-    # unsafe meta access, ok?
-    return $META->{readwrite}{$class}{$id} if exists $META->{readwrite}{$class}{$id};
-    $META->{readwrite}{$class}{$id} ||= $class->new(ID => $id);
-}
-
-#-> sub CPAN::new ;
-sub new {
-    bless {}, shift;
-}
-
-#-> sub CPAN::cleanup ;
-sub cleanup {
-  # warn "cleanup called with arg[@_] End[$CPAN::End] Signal[$Signal]";
-  local $SIG{__DIE__} = '';
-  my($message) = @_;
-  my $i = 0;
-  my $ineval = 0;
-  my($subroutine);
-  while ((undef,undef,undef,$subroutine) = caller(++$i)) {
-      $ineval = 1, last if
-        $subroutine eq '(eval)';
-  }
-  return if $ineval && !$CPAN::End;
-  return unless defined $META->{LOCK};
-  return unless -f $META->{LOCK};
-  $META->savehist;
-  close $META->{LOCKFH};
-  unlink $META->{LOCK};
-  # require Carp;
-  # Carp::cluck("DEBUGGING");
-  if ( $CPAN::CONFIG_DIRTY ) {
-      $CPAN::Frontend->mywarn("Warning: Configuration not saved.\n");
-  }
-  $CPAN::Frontend->myprint("Lockfile removed.\n");
-}
-
-#-> sub CPAN::readhist
-sub readhist {
-    my($self,$term,$histfile) = @_;
-    my $histsize = $CPAN::Config->{'histsize'} || 100;
-    $term->Attribs->{'MaxHistorySize'} = $histsize if (defined($term->Attribs->{'MaxHistorySize'}));
-    my($fh) = FileHandle->new;
-    open $fh, "<$histfile" or return;
-    local $/ = "\n";
-    while (<$fh>) {
-        chomp;
-        $term->AddHistory($_);
-    }
-    close $fh;
-}
-
-#-> sub CPAN::savehist
-sub savehist {
-    my($self) = @_;
-    my($histfile,$histsize);
-    unless ($histfile = $CPAN::Config->{'histfile'}) {
-        $CPAN::Frontend->mywarn("No history written (no histfile specified).\n");
-        return;
-    }
-    $histsize = $CPAN::Config->{'histsize'} || 100;
-    if ($CPAN::term) {
-        unless ($CPAN::term->can("GetHistory")) {
-            $CPAN::Frontend->mywarn("Terminal does not support GetHistory.\n");
-            return;
-        }
-    } else {
-        return;
-    }
-    my @h = $CPAN::term->GetHistory;
-    splice @h, 0, @h-$histsize if @h>$histsize;
-    my($fh) = FileHandle->new;
-    open $fh, ">$histfile" or $CPAN::Frontend->mydie("Couldn't open >$histfile: $!");
-    local $\ = local $, = "\n";
-    print $fh @h;
-    close $fh;
-}
-
-#-> sub CPAN::is_tested
-sub is_tested {
-    my($self,$what,$when) = @_;
-    unless ($what) {
-        Carp::cluck("DEBUG: empty what");
-        return;
-    }
-    $self->{is_tested}{$what} = $when;
-}
-
-#-> sub CPAN::reset_tested
-# forget all distributions tested -- resets what gets included in PERL5LIB
-sub reset_tested {
-    my ($self) = @_;
-    $self->{is_tested} = {};
-}
-
-#-> sub CPAN::is_installed
-# unsets the is_tested flag: as soon as the thing is installed, it is
-# not needed in set_perl5lib anymore
-sub is_installed {
-    my($self,$what) = @_;
-    delete $self->{is_tested}{$what};
-}
-
-sub _list_sorted_descending_is_tested {
-    my($self) = @_;
-    sort
-        { ($self->{is_tested}{$b}||0) <=> ($self->{is_tested}{$a}||0) }
-            keys %{$self->{is_tested}}
-}
-
-#-> sub CPAN::set_perl5lib
-# Notes on max environment variable length:
-#   - Win32 : XP or later, 8191; Win2000 or NT4, 2047
-{
-my $fh;
-sub set_perl5lib {
-    my($self,$for) = @_;
-    unless ($for) {
-        (undef,undef,undef,$for) = caller(1);
-        $for =~ s/.*://;
-    }
-    $self->{is_tested} ||= {};
-    return unless %{$self->{is_tested}};
-    my $env = $ENV{PERL5LIB};
-    $env = $ENV{PERLLIB} unless defined $env;
-    my @env;
-    push @env, split /\Q$Config::Config{path_sep}\E/, $env if defined $env and length $env;
-    #my @dirs = map {("$_/blib/arch", "$_/blib/lib")} keys %{$self->{is_tested}};
-    #$CPAN::Frontend->myprint("Prepending @dirs to PERL5LIB.\n");
-
-    my @dirs = map {("$_/blib/arch", "$_/blib/lib")} $self->_list_sorted_descending_is_tested;
-    return if !@dirs;
-
-    if (@dirs < 12) {
-        $CPAN::Frontend->optprint('perl5lib', "Prepending @dirs to PERL5LIB for '$for'\n");
-        $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
-    } elsif (@dirs < 24 ) {
-        my @d = map {my $cp = $_;
-                     $cp =~ s/^\Q$CPAN::Config->{build_dir}\E/%BUILDDIR%/;
-                     $cp
-                 } @dirs;
-        $CPAN::Frontend->optprint('perl5lib', "Prepending @d to PERL5LIB; ".
-                                 "%BUILDDIR%=$CPAN::Config->{build_dir} ".
-                                 "for '$for'\n"
-                                );
-        $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
-    } else {
-        my $cnt = keys %{$self->{is_tested}};
-        $CPAN::Frontend->optprint('perl5lib', "Prepending blib/arch and blib/lib of ".
-                                 "$cnt build dirs to PERL5LIB; ".
-                                 "for '$for'\n"
-                                );
-        $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env;
-    }
-}}
-
-package CPAN::CacheMgr;
-use strict;
-
-#-> sub CPAN::CacheMgr::as_string ;
-sub as_string {
-    eval { require Data::Dumper };
-    if ($@) {
-        return shift->SUPER::as_string;
-    } else {
-        return Data::Dumper::Dumper(shift);
-    }
-}
-
-#-> sub CPAN::CacheMgr::cachesize ;
-sub cachesize {
-    shift->{DU};
-}
-
-#-> sub CPAN::CacheMgr::tidyup ;
-sub tidyup {
-  my($self) = @_;
-  return unless $CPAN::META->{LOCK};
-  return unless -d $self->{ID};
-  my @toremove = grep { $self->{SIZE}{$_}==0 } @{$self->{FIFO}};
-  for my $current (0..$#toremove) {
-    my $toremove = $toremove[$current];
-    $CPAN::Frontend->myprint(sprintf(
-                                     "DEL(%d/%d): %s \n",
-                                     $current+1,
-                                     scalar @toremove,
-                                     $toremove,
-                                    )
-                            );
-    return if $CPAN::Signal;
-    $self->_clean_cache($toremove);
-    return if $CPAN::Signal;
-  }
-}
-
-#-> sub CPAN::CacheMgr::dir ;
-sub dir {
-    shift->{ID};
-}
-
-#-> sub CPAN::CacheMgr::entries ;
-sub entries {
-    my($self,$dir) = @_;
-    return unless defined $dir;
-    $self->debug("reading dir[$dir]") if $CPAN::DEBUG;
-    $dir ||= $self->{ID};
-    my($cwd) = CPAN::anycwd();
-    chdir $dir or Carp::croak("Can't chdir to $dir: $!");
-    my $dh = DirHandle->new(File::Spec->curdir)
-        or Carp::croak("Couldn't opendir $dir: $!");
-    my(@entries);
-    for ($dh->read) {
-        next if $_ eq "." || $_ eq "..";
-        if (-f $_) {
-            push @entries, File::Spec->catfile($dir,$_);
-        } elsif (-d _) {
-            push @entries, File::Spec->catdir($dir,$_);
-        } else {
-            $CPAN::Frontend->mywarn("Warning: weird direntry in $dir: $_\n");
-        }
-    }
-    chdir $cwd or Carp::croak("Can't chdir to $cwd: $!");
-    sort { -M $a <=> -M $b} @entries;
-}
-
-#-> sub CPAN::CacheMgr::disk_usage ;
-sub disk_usage {
-    my($self,$dir,$fast) = @_;
-    return if exists $self->{SIZE}{$dir};
-    return if $CPAN::Signal;
-    my($Du) = 0;
-    if (-e $dir) {
-        if (-d $dir) {
-            unless (-x $dir) {
-                unless (chmod 0755, $dir) {
-                    $CPAN::Frontend->mywarn("I have neither the -x permission nor the ".
-                                            "permission to change the permission; cannot ".
-                                            "estimate disk usage of '$dir'\n");
-                    $CPAN::Frontend->mysleep(5);
-                    return;
-                }
-            }
-        } elsif (-f $dir) {
-            # nothing to say, no matter what the permissions
-        }
-    } else {
-        $CPAN::Frontend->mywarn("File or directory '$dir' has gone, ignoring\n");
-        return;
-    }
-    if ($fast) {
-        $Du = 0; # placeholder
-    } else {
-        find(
-             sub {
-           $File::Find::prune++ if $CPAN::Signal;
-           return if -l $_;
-           if ($^O eq 'MacOS') {
-             require Mac::Files;
-             my $cat  = Mac::Files::FSpGetCatInfo($_);
-             $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen() if $cat;
-           } else {
-             if (-d _) {
-               unless (-x _) {
-                 unless (chmod 0755, $_) {
-                   $CPAN::Frontend->mywarn("I have neither the -x permission nor ".
-                                           "the permission to change the permission; ".
-                                           "can only partially estimate disk usage ".
-                                           "of '$_'\n");
-                   $CPAN::Frontend->mysleep(5);
-                   return;
-                 }
-               }
-             } else {
-               $Du += (-s _);
-             }
-           }
-         },
-         $dir
-            );
-    }
-    return if $CPAN::Signal;
-    $self->{SIZE}{$dir} = $Du/1024/1024;
-    unshift @{$self->{FIFO}}, $dir;
-    $self->debug("measured $dir is $Du") if $CPAN::DEBUG;
-    $self->{DU} += $Du/1024/1024;
-    $self->{DU};
-}
-
-#-> sub CPAN::CacheMgr::_clean_cache ;
-sub _clean_cache {
-    my($self,$dir) = @_;
-    return unless -e $dir;
-    unless (File::Spec->canonpath(File::Basename::dirname($dir))
-            eq File::Spec->canonpath($CPAN::Config->{build_dir})) {
-        $CPAN::Frontend->mywarn("Directory '$dir' not below $CPAN::Config->{build_dir}, ".
-                                "will not remove\n");
-        $CPAN::Frontend->mysleep(5);
-        return;
-    }
-    $self->debug("have to rmtree $dir, will free $self->{SIZE}{$dir}")
-        if $CPAN::DEBUG;
-    File::Path::rmtree($dir);
-    my $id_deleted = 0;
-    if ($dir !~ /\.yml$/ && -f "$dir.yml") {
-        my $yaml_module = CPAN::_yaml_module;
-        if ($CPAN::META->has_inst($yaml_module)) {
-            my($peek_yaml) = eval { CPAN->_yaml_loadfile("$dir.yml"); };
-            if ($@) {
-                $CPAN::Frontend->mywarn("(parse error on '$dir.yml' removing anyway)");
-                unlink "$dir.yml" or
-                    $CPAN::Frontend->mywarn("(Could not unlink '$dir.yml': $!)");
-                return;
-            } elsif (my $id = $peek_yaml->[0]{distribution}{ID}) {
-                $CPAN::META->delete("CPAN::Distribution", $id);
-
-                # XXX we should restore the state NOW, otherise this
-                # distro does not exist until we read an index. BUG ALERT(?)
-
-                # $CPAN::Frontend->mywarn (" +++\n");
-                $id_deleted++;
-            }
-        }
-        unlink "$dir.yml"; # may fail
-        unless ($id_deleted) {
-            CPAN->debug("no distro found associated with '$dir'");
-        }
-    }
-    $self->{DU} -= $self->{SIZE}{$dir};
-    delete $self->{SIZE}{$dir};
-}
-
-#-> sub CPAN::CacheMgr::new ;
-sub new {
-    my $class = shift;
-    my $time = time;
-    my($debug,$t2);
-    $debug = "";
-    my $self = {
-        ID => $CPAN::Config->{build_dir},
-        MAX => $CPAN::Config->{'build_cache'},
-        SCAN => $CPAN::Config->{'scan_cache'} || 'atstart',
-        DU => 0
-    };
-    File::Path::mkpath($self->{ID});
-    my $dh = DirHandle->new($self->{ID});
-    bless $self, $class;
-    $self->scan_cache;
-    $t2 = time;
-    $debug .= "timing of CacheMgr->new: ".($t2 - $time);
-    $time = $t2;
-    CPAN->debug($debug) if $CPAN::DEBUG;
-    $self;
-}
-
-#-> sub CPAN::CacheMgr::scan_cache ;
-sub scan_cache {
-    my $self = shift;
-    return if $self->{SCAN} eq 'never';
-    $CPAN::Frontend->mydie("Unknown scan_cache argument: $self->{SCAN}")
-        unless $self->{SCAN} eq 'atstart';
-    return unless $CPAN::META->{LOCK};
-    $CPAN::Frontend->myprint(
-                             sprintf("Scanning cache %s for sizes\n",
-                             $self->{ID}));
-    my $e;
-    my @entries = $self->entries($self->{ID});
-    my $i = 0;
-    my $painted = 0;
-    for $e (@entries) {
-        my $symbol = ".";
-        if ($self->{DU} > $self->{MAX}) {
-            $symbol = "-";
-            $self->disk_usage($e,1);
-        } else {
-            $self->disk_usage($e);
-        }
-        $i++;
-        while (($painted/76) < ($i/@entries)) {
-            $CPAN::Frontend->myprint($symbol);
-            $painted++;
-        }
-        return if $CPAN::Signal;
-    }
-    $CPAN::Frontend->myprint("DONE\n");
-    $self->tidyup;
-}
-
-package CPAN::Shell;
-use strict;
-
-#-> sub CPAN::Shell::h ;
-sub h {
-    my($class,$about) = @_;
-    if (defined $about) {
-        my $help;
-        if (exists $Help->{$about}) {
-            if (ref $Help->{$about}) { # aliases
-                $about = ${$Help->{$about}};
-            }
-            $help = $Help->{$about};
-        } else {
-            $help = "No help available";
-        }
-        $CPAN::Frontend->myprint("$about\: $help\n");
-    } else {
-        my $filler = " " x (80 - 28 - length($CPAN::VERSION));
-        $CPAN::Frontend->myprint(qq{
-Display Information $filler (ver $CPAN::VERSION)
- command  argument          description
- a,b,d,m  WORD or /REGEXP/  about authors, bundles, distributions, modules
- i        WORD or /REGEXP/  about any of the above
- ls       AUTHOR or GLOB    about files in the author's directory
-    (with WORD being a module, bundle or author name or a distribution
-    name of the form AUTHOR/DISTRIBUTION)
-
-Download, Test, Make, Install...
- get      download                     clean    make clean
- make     make (implies get)           look     open subshell in dist directory
- test     make test (implies make)     readme   display these README files
- install  make install (implies test)  perldoc  display POD documentation
-
-Upgrade
- r        WORDs or /REGEXP/ or NONE    report updates for some/matching/all modules
- upgrade  WORDs or /REGEXP/ or NONE    upgrade some/matching/all modules
-
-Pragmas
- force  CMD    try hard to do command  fforce CMD    try harder
- notest CMD    skip testing
-
-Other
- h,?           display this menu       ! perl-code   eval a perl command
- o conf [opt]  set and query options   q             quit the cpan shell
- reload cpan   load CPAN.pm again      reload index  load newer indices
- autobundle    Snapshot                recent        latest CPAN uploads});
-}
-}
-
-*help = \&h;
-
-#-> sub CPAN::Shell::a ;
-sub a {
-  my($self,@arg) = @_;
-  # authors are always UPPERCASE
-  for (@arg) {
-    $_ = uc $_ unless /=/;
-  }
-  $CPAN::Frontend->myprint($self->format_result('Author',@arg));
-}
-
-#-> sub CPAN::Shell::globls ;
-sub globls {
-    my($self,$s,$pragmas) = @_;
-    # ls is really very different, but we had it once as an ordinary
-    # command in the Shell (upto rev. 321) and we could not handle
-    # force well then
-    my(@accept,@preexpand);
-    if ($s =~ /[\*\?\/]/) {
-        if ($CPAN::META->has_inst("Text::Glob")) {
-            if (my($au,$pathglob) = $s =~ m|(.*?)/(.*)|) {
-                my $rau = Text::Glob::glob_to_regex(uc $au);
-                CPAN::Shell->debug("au[$au]pathglob[$pathglob]rau[$rau]")
-                      if $CPAN::DEBUG;
-                push @preexpand, map { $_->id . "/" . $pathglob }
-                    CPAN::Shell->expand_by_method('CPAN::Author',['id'],"/$rau/");
-            } else {
-                my $rau = Text::Glob::glob_to_regex(uc $s);
-                push @preexpand, map { $_->id }
-                    CPAN::Shell->expand_by_method('CPAN::Author',
-                                                  ['id'],
-                                                  "/$rau/");
-            }
-        } else {
-            $CPAN::Frontend->mydie("Text::Glob not installed, cannot proceed");
-        }
-    } else {
-        push @preexpand, uc $s;
-    }
-    for (@preexpand) {
-        unless (/^[A-Z0-9\-]+(\/|$)/i) {
-            $CPAN::Frontend->mywarn("ls command rejects argument $_: not an author\n");
-            next;
-        }
-        push @accept, $_;
-    }
-    my $silent = @accept>1;
-    my $last_alpha = "";
-    my @results;
-    for my $a (@accept) {
-        my($author,$pathglob);
-        if ($a =~ m|(.*?)/(.*)|) {
-            my $a2 = $1;
-            $pathglob = $2;
-            $author = CPAN::Shell->expand_by_method('CPAN::Author',
-                                                    ['id'],
-                                                    $a2)
-                or $CPAN::Frontend->mydie("No author found for $a2\n");
-        } else {
-            $author = CPAN::Shell->expand_by_method('CPAN::Author',
-                                                    ['id'],
-                                                    $a)
-                or $CPAN::Frontend->mydie("No author found for $a\n");
-        }
-        if ($silent) {
-            my $alpha = substr $author->id, 0, 1;
-            my $ad;
-            if ($alpha eq $last_alpha) {
-                $ad = "";
-            } else {
-                $ad = "[$alpha]";
-                $last_alpha = $alpha;
-            }
-            $CPAN::Frontend->myprint($ad);
-        }
-        for my $pragma (@$pragmas) {
-            if ($author->can($pragma)) {
-                $author->$pragma();
-            }
-        }
-        push @results, $author->ls($pathglob,$silent); # silent if
-                                                       # more than one
-                                                       # author
-        for my $pragma (@$pragmas) {
-            my $unpragma = "un$pragma";
-            if ($author->can($unpragma)) {
-                $author->$unpragma();
-            }
-        }
-    }
-    @results;
-}
-
-#-> sub CPAN::Shell::local_bundles ;
-sub local_bundles {
-    my($self,@which) = @_;
-    my($incdir,$bdir,$dh);
-    foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) {
-        my @bbase = "Bundle";
-        while (my $bbase = shift @bbase) {
-            $bdir = File::Spec->catdir($incdir,split /::/, $bbase);
-            CPAN->debug("bdir[$bdir]\@bbase[@bbase]") if $CPAN::DEBUG;
-            if ($dh = DirHandle->new($bdir)) { # may fail
-                my($entry);
-                for $entry ($dh->read) {
-                    next if $entry =~ /^\./;
-                    next unless $entry =~ /^\w+(\.pm)?(?!\n)\Z/;
-                    if (-d File::Spec->catdir($bdir,$entry)) {
-                        push @bbase, "$bbase\::$entry";
-                    } else {
-                        next unless $entry =~ s/\.pm(?!\n)\Z//;
-                        $CPAN::META->instance('CPAN::Bundle',"$bbase\::$entry");
-                    }
-                }
-            }
-        }
-    }
-}
-
-#-> sub CPAN::Shell::b ;
-sub b {
-    my($self,@which) = @_;
-    CPAN->debug("which[@which]") if $CPAN::DEBUG;
-    $self->local_bundles;
-    $CPAN::Frontend->myprint($self->format_result('Bundle',@which));
-}
-
-#-> sub CPAN::Shell::d ;
-sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));}
-
-#-> sub CPAN::Shell::m ;
-sub m { # emacs confused here }; sub mimimimimi { # emacs in sync here
-    my $self = shift;
-    $CPAN::Frontend->myprint($self->format_result('Module',@_));
-}
-
-#-> sub CPAN::Shell::i ;
-sub i {
-    my($self) = shift;
-    my(@args) = @_;
-    @args = '/./' unless @args;
-    my(@result);
-    for my $type (qw/Bundle Distribution Module/) {
-        push @result, $self->expand($type,@args);
-    }
-    # Authors are always uppercase.
-    push @result, $self->expand("Author", map { uc $_ } @args);
-
-    my $result = @result == 1 ?
-        $result[0]->as_string :
-            @result == 0 ?
-                "No objects found of any type for argument @args\n" :
-                    join("",
-                         (map {$_->as_glimpse} @result),
-                         scalar @result, " items found\n",
-                        );
-    $CPAN::Frontend->myprint($result);
-}
-
-#-> sub CPAN::Shell::o ;
-
-# CPAN::Shell::o and CPAN::HandleConfig::edit are closely related. 'o
-# conf' calls through to CPAN::HandleConfig::edit. 'o conf' should
-# probably have been called 'set' and 'o debug' maybe 'set debug' or
-# 'debug'; 'o conf ARGS' calls ->edit in CPAN/HandleConfig.pm
-sub o {
-    my($self,$o_type,@o_what) = @_;
-    $o_type ||= "";
-    CPAN->debug("o_type[$o_type] o_what[".join(" | ",@o_what)."]\n");
-    if ($o_type eq 'conf') {
-        my($cfilter);
-        ($cfilter) = $o_what[0] =~ m|^/(.*)/$| if @o_what;
-        if (!@o_what or $cfilter) { # print all things, "o conf"
-            $cfilter ||= "";
-            my $qrfilter = eval 'qr/$cfilter/';
-            my($k,$v);
-            $CPAN::Frontend->myprint("\$CPAN::Config options from ");
-            my @from;
-            if (exists $INC{'CPAN/Config.pm'}) {
-                push @from, $INC{'CPAN/Config.pm'};
-            }
-            if (exists $INC{'CPAN/MyConfig.pm'}) {
-                push @from, $INC{'CPAN/MyConfig.pm'};
-            }
-            $CPAN::Frontend->myprint(join " and ", map {"'$_'"} @from);
-            $CPAN::Frontend->myprint(":\n");
-            for $k (sort keys %CPAN::HandleConfig::can) {
-                next unless $k =~ /$qrfilter/;
-                $v = $CPAN::HandleConfig::can{$k};
-                $CPAN::Frontend->myprint(sprintf "    %-18s [%s]\n", $k, $v);
-            }
-            $CPAN::Frontend->myprint("\n");
-            for $k (sort keys %CPAN::HandleConfig::keys) {
-                next unless $k =~ /$qrfilter/;
-                CPAN::HandleConfig->prettyprint($k);
-            }
-            $CPAN::Frontend->myprint("\n");
-        } else {
-            if (CPAN::HandleConfig->edit(@o_what)) {
-            } else {
-                $CPAN::Frontend->myprint(qq{Type 'o conf' to view all configuration }.
-                                         qq{items\n\n});
-            }
-        }
-    } elsif ($o_type eq 'debug') {
-        my(%valid);
-        @o_what = () if defined $o_what[0] && $o_what[0] =~ /help/i;
-        if (@o_what) {
-            while (@o_what) {
-                my($what) = shift @o_what;
-                if ($what =~ s/^-// && exists $CPAN::DEBUG{$what}) {
-                    $CPAN::DEBUG &= $CPAN::DEBUG ^ $CPAN::DEBUG{$what};
-                    next;
-                }
-                if ( exists $CPAN::DEBUG{$what} ) {
-                    $CPAN::DEBUG |= $CPAN::DEBUG{$what};
-                } elsif ($what =~ /^\d/) {
-                    $CPAN::DEBUG = $what;
-                } elsif (lc $what eq 'all') {
-                    my($max) = 0;
-                    for (values %CPAN::DEBUG) {
-                        $max += $_;
-                    }
-                    $CPAN::DEBUG = $max;
-                } else {
-                    my($known) = 0;
-                    for (keys %CPAN::DEBUG) {
-                        next unless lc($_) eq lc($what);
-                        $CPAN::DEBUG |= $CPAN::DEBUG{$_};
-                        $known = 1;
-                    }
-                    $CPAN::Frontend->myprint("unknown argument [$what]\n")
-                        unless $known;
-                }
-            }
-        } else {
-            my $raw = "Valid options for debug are ".
-                join(", ",sort(keys %CPAN::DEBUG), 'all').
-                     qq{ or a number. Completion works on the options. }.
-                     qq{Case is ignored.};
-            require Text::Wrap;
-            $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw));
-            $CPAN::Frontend->myprint("\n\n");
-        }
-        if ($CPAN::DEBUG) {
-            $CPAN::Frontend->myprint("Options set for debugging ($CPAN::DEBUG):\n");
-            my($k,$v);
-            for $k (sort {$CPAN::DEBUG{$a} <=> $CPAN::DEBUG{$b}} keys %CPAN::DEBUG) {
-                $v = $CPAN::DEBUG{$k};
-                $CPAN::Frontend->myprint(sprintf "    %-14s(%s)\n", $k, $v)
-                    if $v & $CPAN::DEBUG;
-            }
-        } else {
-            $CPAN::Frontend->myprint("Debugging turned off completely.\n");
-        }
-    } else {
-        $CPAN::Frontend->myprint(qq{
-Known options:
-  conf    set or get configuration variables
-  debug   set or get debugging options
-});
-    }
-}
-
-# CPAN::Shell::paintdots_onreload
-sub paintdots_onreload {
-    my($ref) = shift;
-    sub {
-        if ( $_[0] =~ /[Ss]ubroutine ([\w:]+) redefined/ ) {
-            my($subr) = $1;
-            ++$$ref;
-            local($|) = 1;
-            # $CPAN::Frontend->myprint(".($subr)");
-            $CPAN::Frontend->myprint(".");
-            if ($subr =~ /\bshell\b/i) {
-                # warn "debug[$_[0]]";
-
-                # It would be nice if we could detect that a
-                # subroutine has actually changed, but for now we
-                # practically always set the GOTOSHELL global
-
-                $CPAN::GOTOSHELL=1;
-            }
-            return;
-        }
-        warn @_;
-    };
-}
-
-#-> sub CPAN::Shell::hosts ;
-sub hosts {
-    my($self) = @_;
-    my $fullstats = CPAN::FTP->_ftp_statistics();
-    my $history = $fullstats->{history} || [];
-    my %S; # statistics
-    while (my $last = pop @$history) {
-        my $attempts = $last->{attempts} or next;
-        my $start;
-        if (@$attempts) {
-            $start = $attempts->[-1]{start};
-            if ($#$attempts > 0) {
-                for my $i (0..$#$attempts-1) {
-                    my $url = $attempts->[$i]{url} or next;
-                    $S{no}{$url}++;
-                }
-            }
-        } else {
-            $start = $last->{start};
-        }
-        next unless $last->{thesiteurl}; # C-C? bad filenames?
-        $S{start} = $start;
-        $S{end} ||= $last->{end};
-        my $dltime = $last->{end} - $start;
-        my $dlsize = $last->{filesize} || 0;
-        my $url = ref $last->{thesiteurl} ? $last->{thesiteurl}->text : $last->{thesiteurl};
-        my $s = $S{ok}{$url} ||= {};
-        $s->{n}++;
-        $s->{dlsize} ||= 0;
-        $s->{dlsize} += $dlsize/1024;
-        $s->{dltime} ||= 0;
-        $s->{dltime} += $dltime;
-    }
-    my $res;
-    for my $url (keys %{$S{ok}}) {
-        next if $S{ok}{$url}{dltime} == 0; # div by zero
-        push @{$res->{ok}}, [@{$S{ok}{$url}}{qw(n dlsize dltime)},
-                             $S{ok}{$url}{dlsize}/$S{ok}{$url}{dltime},
-                             $url,
-                            ];
-    }
-    for my $url (keys %{$S{no}}) {
-        push @{$res->{no}}, [$S{no}{$url},
-                             $url,
-                            ];
-    }
-    my $R = ""; # report
-    if ($S{start} && $S{end}) {
-        $R .= sprintf "Log starts: %s\n", $S{start} ? scalar(localtime $S{start}) : "unknown";
-        $R .= sprintf "Log ends  : %s\n", $S{end}   ? scalar(localtime $S{end})   : "unknown";
-    }
-    if ($res->{ok} && @{$res->{ok}}) {
-        $R .= sprintf "\nSuccessful downloads:
-   N       kB  secs      kB/s url\n";
-        my $i = 20;
-        for (sort { $b->[3] <=> $a->[3] } @{$res->{ok}}) {
-            $R .= sprintf "%4d %8d %5d %9.1f %s\n", @$_;
-            last if --$i<=0;
-        }
-    }
-    if ($res->{no} && @{$res->{no}}) {
-        $R .= sprintf "\nUnsuccessful downloads:\n";
-        my $i = 20;
-        for (sort { $b->[0] <=> $a->[0] } @{$res->{no}}) {
-            $R .= sprintf "%4d %s\n", @$_;
-            last if --$i<=0;
-        }
-    }
-    $CPAN::Frontend->myprint($R);
-}
-
-# here is where 'reload cpan' is done
-#-> sub CPAN::Shell::reload ;
-sub reload {
-    my($self,$command,@arg) = @_;
-    $command ||= "";
-    $self->debug("self[$self]command[$command]arg[@arg]") if $CPAN::DEBUG;
-    if ($command =~ /^cpan$/i) {
-        my $redef = 0;
-        chdir $CPAN::iCwd if $CPAN::iCwd; # may fail
-        my $failed;
-      MFILE: for my $f (@relo) {
-            next unless exists $INC{$f};
-            my $p = $f;
-            $p =~ s/\.pm$//;
-            $p =~ s|/|::|g;
-            $CPAN::Frontend->myprint("($p");
-            local($SIG{__WARN__}) = paintdots_onreload(\$redef);
-            $self->_reload_this($f) or $failed++;
-            my $v = eval "$p\::->VERSION";
-            $CPAN::Frontend->myprint("v$v)");
-        }
-        $CPAN::Frontend->myprint("\n$redef subroutines redefined\n");
-        if ($failed) {
-            my $errors = $failed == 1 ? "error" : "errors";
-            $CPAN::Frontend->mywarn("\n$failed $errors during reload. You better quit ".
-                                    "this session.\n");
-        }
-    } elsif ($command =~ /^index$/i) {
-      CPAN::Index->force_reload;
-    } else {
-      $CPAN::Frontend->myprint(qq{cpan     re-evals the CPAN modules
-index    re-reads the index files\n});
-    }
-}
-
-# reload means only load again what we have loaded before
-#-> sub CPAN::Shell::_reload_this ;
-sub _reload_this {
-    my($self,$f,$args) = @_;
-    CPAN->debug("f[$f]") if $CPAN::DEBUG;
-    return 1 unless $INC{$f}; # we never loaded this, so we do not
-                              # reload but say OK
-    my $pwd = CPAN::anycwd();
-    CPAN->debug("pwd[$pwd]") if $CPAN::DEBUG;
-    my($file);
-    for my $inc (@INC) {
-        $file = File::Spec->catfile($inc,split /\//, $f);
-        last if -f $file;
-        $file = "";
-    }
-    CPAN->debug("file[$file]") if $CPAN::DEBUG;
-    my @inc = @INC;
-    unless ($file && -f $file) {
-        # this thingie is not in the INC path, maybe CPAN/MyConfig.pm?
-        $file = $INC{$f};
-        unless (CPAN->has_inst("File::Basename")) {
-            @inc = File::Basename::dirname($file);
-        } else {
-            # do we ever need this?
-            @inc = substr($file,0,-length($f)-1); # bring in back to me!
-        }
-    }
-    CPAN->debug("file[$file]inc[@inc]") if $CPAN::DEBUG;
-    unless (-f $file) {
-        $CPAN::Frontend->mywarn("Found no file to reload for '$f'\n");
-        return;
-    }
-    my $mtime = (stat $file)[9];
-    $reload->{$f} ||= -1;
-    my $must_reload = $mtime != $reload->{$f};
-    $args ||= {};
-    $must_reload ||= $args->{reloforce}; # o conf defaults needs this
-    if ($must_reload) {
-        my $fh = FileHandle->new($file) or
-            $CPAN::Frontend->mydie("Could not open $file: $!");
-        local($/);
-        local $^W = 1;
-        my $content = <$fh>;
-        CPAN->debug(sprintf("reload file[%s] content[%s...]",$file,substr($content,0,128)))
-            if $CPAN::DEBUG;
-        delete $INC{$f};
-        local @INC = @inc;
-        eval "require '$f'";
-        if ($@) {
-            warn $@;
-            return;
-        }
-        $reload->{$f} = $mtime;
-    } else {
-        $CPAN::Frontend->myprint("__unchanged__");
-    }
-    return 1;
-}
-
-#-> sub CPAN::Shell::mkmyconfig ;
-sub mkmyconfig {
-    my($self, $cpanpm, %args) = @_;
-    require CPAN::FirstTime;
-    my $home = CPAN::HandleConfig::home;
-    $cpanpm = $INC{'CPAN/MyConfig.pm'} ||
-        File::Spec->catfile(split /\//, "$home/.cpan/CPAN/MyConfig.pm");
-    File::Path::mkpath(File::Basename::dirname($cpanpm)) unless -e $cpanpm;
-    CPAN::HandleConfig::require_myconfig_or_config;
-    $CPAN::Config ||= {};
-    $CPAN::Config = {
-        %$CPAN::Config,
-        build_dir           =>  undef,
-        cpan_home           =>  undef,
-        keep_source_where   =>  undef,
-        histfile            =>  undef,
-    };
-    CPAN::FirstTime::init($cpanpm, %args);
-}
-
-#-> sub CPAN::Shell::_binary_extensions ;
-sub _binary_extensions {
-    my($self) = shift @_;
-    my(@result,$module,%seen,%need,$headerdone);
-    for $module ($self->expand('Module','/./')) {
-        my $file  = $module->cpan_file;
-        next if $file eq "N/A";
-        next if $file =~ /^Contact Author/;
-        my $dist = $CPAN::META->instance('CPAN::Distribution',$file);
-        next if $dist->isa_perl;
-        next unless $module->xs_file;
-        local($|) = 1;
-        $CPAN::Frontend->myprint(".");
-        push @result, $module;
-    }
-#    print join " | ", @result;
-    $CPAN::Frontend->myprint("\n");
-    return @result;
-}
-
-#-> sub CPAN::Shell::recompile ;
-sub recompile {
-    my($self) = shift @_;
-    my($module,@module,$cpan_file,%dist);
-    @module = $self->_binary_extensions();
-    for $module (@module) { # we force now and compile later, so we
-                            # don't do it twice
-        $cpan_file = $module->cpan_file;
-        my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
-        $pack->force;
-        $dist{$cpan_file}++;
-    }
-    for $cpan_file (sort keys %dist) {
-        $CPAN::Frontend->myprint("  CPAN: Recompiling $cpan_file\n\n");
-        my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file);
-        $pack->install;
-        $CPAN::Signal = 0; # it's tempting to reset Signal, so we can
-                           # stop a package from recompiling,
-                           # e.g. IO-1.12 when we have perl5.003_10
-    }
-}
-
-#-> sub CPAN::Shell::scripts ;
-sub scripts {
-    my($self, $arg) = @_;
-    $CPAN::Frontend->mywarn(">>>> experimental command, currently unsupported <<<<\n\n");
-
-    for my $req (qw( HTML::LinkExtor Sort::Versions List::Util )) {
-        unless ($CPAN::META->has_inst($req)) {
-            $CPAN::Frontend->mywarn("  $req not available\n");
-        }
-    }
-    my $p = HTML::LinkExtor->new();
-    my $indexfile = "/home/ftp/pub/PAUSE/scripts/new/index.html";
-    unless (-f $indexfile) {
-        $CPAN::Frontend->mydie("found no indexfile[$indexfile]\n");
-    }
-    $p->parse_file($indexfile);
-    my @hrefs;
-    my $qrarg;
-    if ($arg =~ s|^/(.+)/$|$1|) {
-        $qrarg = eval 'qr/$arg/'; # hide construct from 5.004
-    }
-    for my $l ($p->links) {
-        my $tag = shift @$l;
-        next unless $tag eq "a";
-        my %att = @$l;
-        my $href = $att{href};
-        next unless $href =~ s|^\.\./authors/id/./../||;
-        if ($arg) {
-            if ($qrarg) {
-                if ($href =~ $qrarg) {
-                    push @hrefs, $href;
-                }
-            } else {
-                if ($href =~ /\Q$arg\E/) {
-                    push @hrefs, $href;
-                }
-            }
-        } else {
-            push @hrefs, $href;
-        }
-    }
-    # now filter for the latest version if there is more than one of a name
-    my %stems;
-    for (sort @hrefs) {
-        my $href = $_;
-        s/-v?\d.*//;
-        my $stem = $_;
-        $stems{$stem} ||= [];
-        push @{$stems{$stem}}, $href;
-    }
-    for (sort keys %stems) {
-        my $highest;
-        if (@{$stems{$_}} > 1) {
-            $highest = List::Util::reduce {
-                Sort::Versions::versioncmp($a,$b) > 0 ? $a : $b
-              } @{$stems{$_}};
-        } else {
-            $highest = $stems{$_}[0];
-        }
-        $CPAN::Frontend->myprint("$highest\n");
-    }
-}
-
-#-> sub CPAN::Shell::report ;
-sub report {
-    my($self,@args) = @_;
-    unless ($CPAN::META->has_inst("CPAN::Reporter")) {
-        $CPAN::Frontend->mydie("CPAN::Reporter not installed; cannot continue");
-    }
-    local $CPAN::Config->{test_report} = 1;
-    $self->force("test",@args); # force is there so that the test be
-                                # re-run (as documented)
-}
-
-# compare with is_tested
-#-> sub CPAN::Shell::install_tested
-sub install_tested {
-    my($self,@some) = @_;
-    $CPAN::Frontend->mywarn("install_tested() must not be called with arguments.\n"),
-        return if @some;
-    CPAN::Index->reload;
-
-    for my $b (reverse $CPAN::META->_list_sorted_descending_is_tested) {
-        my $yaml = "$b.yml";
-        unless (-f $yaml) {
-            $CPAN::Frontend->mywarn("No YAML file for $b available, skipping\n");
-            next;
-        }
-        my $yaml_content = CPAN->_yaml_loadfile($yaml);
-        my $id = $yaml_content->[0]{distribution}{ID};
-        unless ($id) {
-            $CPAN::Frontend->mywarn("No ID found in '$yaml', skipping\n");
-            next;
-        }
-        my $do = CPAN::Shell->expandany($id);
-        unless ($do) {
-            $CPAN::Frontend->mywarn("Could not expand ID '$id', skipping\n");
-            next;
-        }
-        unless ($do->{build_dir}) {
-            $CPAN::Frontend->mywarn("Distro '$id' has no build_dir, skipping\n");
-            next;
-        }
-        unless ($do->{build_dir} eq $b) {
-            $CPAN::Frontend->mywarn("Distro '$id' has build_dir '$do->{build_dir}' but expected '$b', skipping\n");
-            next;
-        }
-        push @some, $do;
-    }
-
-    $CPAN::Frontend->mywarn("No tested distributions found.\n"),
-        return unless @some;
-
-    @some = grep { $_->{make_test} && ! $_->{make_test}->failed } @some;
-    $CPAN::Frontend->mywarn("No distributions tested with this build of perl found.\n"),
-        return unless @some;
-
-    # @some = grep { not $_->uptodate } @some;
-    # $CPAN::Frontend->mywarn("No non-uptodate distributions tested with this build of perl found.\n"),
-    #     return unless @some;
-
-    CPAN->debug("some[@some]");
-    for my $d (@some) {
-        my $id = $d->can("pretty_id") ? $d->pretty_id : $d->id;
-        $CPAN::Frontend->myprint("install_tested: Running for $id\n");
-        $CPAN::Frontend->mysleep(1);
-        $self->install($d);
-    }
-}
-
-#-> sub CPAN::Shell::upgrade ;
-sub upgrade {
-    my($self,@args) = @_;
-    $self->install($self->r(@args));
-}
-
-#-> sub CPAN::Shell::_u_r_common ;
-sub _u_r_common {
-    my($self) = shift @_;
-    my($what) = shift @_;
-    CPAN->debug("self[$self] what[$what] args[@_]") if $CPAN::DEBUG;
-    Carp::croak "Usage: \$obj->_u_r_common(a|r|u)" unless
-          $what && $what =~ /^[aru]$/;
-    my(@args) = @_;
-    @args = '/./' unless @args;
-    my(@result,$module,%seen,%need,$headerdone,
-       $version_undefs,$version_zeroes,
-       @version_undefs,@version_zeroes);
-    $version_undefs = $version_zeroes = 0;
-    my $sprintf = "%s%-25s%s %9s %9s  %s\n";
-    my @expand = $self->expand('Module',@args);
-    if ($CPAN::DEBUG) { # Looks like noise to me, was very useful for debugging
-             # for metadata cache
-        my $expand = scalar @expand;
-        $CPAN::Frontend->myprint(sprintf "%d matches in the database, time[%d]\n", $expand, time);
-    }
-    my @sexpand;
-    if ($] < 5.008) {
-        # hard to believe that the more complex sorting can lead to
-        # stack curruptions on older perl
-        @sexpand = sort {$a->id cmp $b->id} @expand;
-    } else {
-        @sexpand = map {
-            $_->[1]
-        } sort {
-            $b->[0] <=> $a->[0]
-            ||
-            $a->[1]{ID} cmp $b->[1]{ID},
-        } map {
-            [$_->_is_representative_module,
-             $_
-            ]
-        } @expand;
-    }
-    if ($CPAN::DEBUG) {
-        $CPAN::Frontend->myprint(sprintf "sorted at time[%d]\n", time);
-        sleep 1;
-    }
-  MODULE: for $module (@sexpand) {
-        my $file  = $module->cpan_file;
-        next MODULE unless defined $file; # ??
-        $file =~ s!^./../!!;
-        my($latest) = $module->cpan_version;
-        my($inst_file) = $module->inst_file;
-        CPAN->debug("file[$file]latest[$latest]") if $CPAN::DEBUG;
-        my($have);
-        return if $CPAN::Signal;
-        my($next_MODULE);
-        eval { # version.pm involved!
-            if ($inst_file) {
-                if ($what eq "a") {
-                    $have = $module->inst_version;
-                } elsif ($what eq "r") {
-                    $have = $module->inst_version;
-                    local($^W) = 0;
-                    if ($have eq "undef") {
-                        $version_undefs++;
-                        push @version_undefs, $module->as_glimpse;
-                    } elsif (CPAN::Version->vcmp($have,0)==0) {
-                        $version_zeroes++;
-                        push @version_zeroes, $module->as_glimpse;
-                    }
-                    ++$next_MODULE unless CPAN::Version->vgt($latest, $have);
-                    # to be pedantic we should probably say:
-                    #    && !($have eq "undef" && $latest ne "undef" && $latest gt "");
-                    # to catch the case where CPAN has a version 0 and we have a version undef
-                } elsif ($what eq "u") {
-                    ++$next_MODULE;
-                }
-            } else {
-                if ($what eq "a") {
-                    ++$next_MODULE;
-                } elsif ($what eq "r") {
-                    ++$next_MODULE;
-                } elsif ($what eq "u") {
-                    $have = "-";
-                }
-            }
-        };
-        next MODULE if $next_MODULE;
-        if ($@) {
-            $CPAN::Frontend->mywarn
-                (sprintf("Error while comparing cpan/installed versions of '%s':
-INST_FILE: %s
-INST_VERSION: %s %s
-CPAN_VERSION: %s %s
-",
-                         $module->id,
-                         $inst_file || "",
-                         (defined $have ? $have : "[UNDEFINED]"),
-                         (ref $have ? ref $have : ""),
-                         $latest,
-                         (ref $latest ? ref $latest : ""),
-                        ));
-            next MODULE;
-        }
-        return if $CPAN::Signal; # this is sometimes lengthy
-        $seen{$file} ||= 0;
-        if ($what eq "a") {
-            push @result, sprintf "%s %s\n", $module->id, $have;
-        } elsif ($what eq "r") {
-            push @result, $module->id;
-            next MODULE if $seen{$file}++;
-        } elsif ($what eq "u") {
-            push @result, $module->id;
-            next MODULE if $seen{$file}++;
-            next MODULE if $file =~ /^Contact/;
-        }
-        unless ($headerdone++) {
-            $CPAN::Frontend->myprint("\n");
-            $CPAN::Frontend->myprint(sprintf(
-                                             $sprintf,
-                                             "",
-                                             "Package namespace",
-                                             "",
-                                             "installed",
-                                             "latest",
-                                             "in CPAN file"
-                                            ));
-        }
-        my $color_on = "";
-        my $color_off = "";
-        if (
-            $COLOR_REGISTERED
-            &&
-            $CPAN::META->has_inst("Term::ANSIColor")
-            &&
-            $module->description
-           ) {
-            $color_on = Term::ANSIColor::color("green");
-            $color_off = Term::ANSIColor::color("reset");
-        }
-        $CPAN::Frontend->myprint(sprintf $sprintf,
-                                 $color_on,
-                                 $module->id,
-                                 $color_off,
-                                 $have,
-                                 $latest,
-                                 $file);
-        $need{$module->id}++;
-    }
-    unless (%need) {
-        if ($what eq "u") {
-            $CPAN::Frontend->myprint("No modules found for @args\n");
-        } elsif ($what eq "r") {
-            $CPAN::Frontend->myprint("All modules are up to date for @args\n");
-        }
-    }
-    if ($what eq "r") {
-        if ($version_zeroes) {
-            my $s_has = $version_zeroes > 1 ? "s have" : " has";
-            $CPAN::Frontend->myprint(qq{$version_zeroes installed module$s_has }.
-                                     qq{a version number of 0\n});
-            if ($CPAN::Config->{show_zero_versions}) {
-                local $" = "\t";
-                $CPAN::Frontend->myprint(qq{  they are\n\t@version_zeroes\n});
-                $CPAN::Frontend->myprint(qq{(use 'o conf show_zero_versions 0' }.
-                                         qq{to hide them)\n});
-            } else {
-                $CPAN::Frontend->myprint(qq{(use 'o conf show_zero_versions 1' }.
-                                         qq{to show them)\n});
-            }
-        }
-        if ($version_undefs) {
-            my $s_has = $version_undefs > 1 ? "s have" : " has";
-            $CPAN::Frontend->myprint(qq{$version_undefs installed module$s_has no }.
-                                     qq{parseable version number\n});
-            if ($CPAN::Config->{show_unparsable_versions}) {
-                local $" = "\t";
-                $CPAN::Frontend->myprint(qq{  they are\n\t@version_undefs\n});
-                $CPAN::Frontend->myprint(qq{(use 'o conf show_unparsable_versions 0' }.
-                                         qq{to hide them)\n});
-            } else {
-                $CPAN::Frontend->myprint(qq{(use 'o conf show_unparsable_versions 1' }.
-                                         qq{to show them)\n});
-            }
-        }
-    }
-    @result;
-}
-
-#-> sub CPAN::Shell::r ;
-sub r {
-    shift->_u_r_common("r",@_);
-}
-
-#-> sub CPAN::Shell::u ;
-sub u {
-    shift->_u_r_common("u",@_);
-}
-
-#-> sub CPAN::Shell::failed ;
-sub failed {
-    my($self,$only_id,$silent) = @_;
-    my @failed;
-  DIST: for my $d ($CPAN::META->all_objects("CPAN::Distribution")) {
-        my $failed = "";
-      NAY: for my $nosayer ( # order matters!
-                            "unwrapped",
-                            "writemakefile",
-                            "signature_verify",
-                            "make",
-                            "make_test",
-                            "install",
-                            "make_clean",
-                           ) {
-            next unless exists $d->{$nosayer};
-            next unless defined $d->{$nosayer};
-            next unless (
-                         UNIVERSAL::can($d->{$nosayer},"failed") ?
-                         $d->{$nosayer}->failed :
-                         $d->{$nosayer} =~ /^NO/
-                        );
-            next NAY if $only_id && $only_id != (
-                                                 UNIVERSAL::can($d->{$nosayer},"commandid")
-                                                 ?
-                                                 $d->{$nosayer}->commandid
-                                                 :
-                                                 $CPAN::CurrentCommandId
-                                                );
-            $failed = $nosayer;
-            last;
-        }
-        next DIST unless $failed;
-        my $id = $d->id;
-        $id =~ s|^./../||;
-        #$print .= sprintf(
-        #                  "  %-45s: %s %s\n",
-        push @failed,
-            (
-             UNIVERSAL::can($d->{$failed},"failed") ?
-             [
-              $d->{$failed}->commandid,
-              $id,
-              $failed,
-              $d->{$failed}->text,
-              $d->{$failed}{TIME}||0,
-             ] :
-             [
-              1,
-              $id,
-              $failed,
-              $d->{$failed},
-              0,
-             ]
-            );
-    }
-    my $scope;
-    if ($only_id) {
-        $scope = "this command";
-    } elsif ($CPAN::Index::HAVE_REANIMATED) {
-        $scope = "this or a previous session";
-        # it might be nice to have a section for previous session and
-        # a second for this
-    } else {
-        $scope = "this session";
-    }
-    if (@failed) {
-        my $print;
-        my $debug = 0;
-        if ($debug) {
-            $print = join "",
-                map { sprintf "%5d %-45s: %s %s\n", @$_ }
-                    sort { $a->[0] <=> $b->[0] } @failed;
-        } else {
-            $print = join "",
-                map { sprintf " %-45s: %s %s\n", @$_[1..3] }
-                    sort {
-                        $a->[0] <=> $b->[0]
-                            ||
-                                $a->[4] <=> $b->[4]
-                       } @failed;
-        }
-        $CPAN::Frontend->myprint("Failed during $scope:\n$print");
-    } elsif (!$only_id || !$silent) {
-        $CPAN::Frontend->myprint("Nothing failed in $scope\n");
-    }
-}
-
-# XXX intentionally undocumented because completely bogus, unportable,
-# useless, etc.
-
-#-> sub CPAN::Shell::status ;
-sub status {
-    my($self) = @_;
-    require Devel::Size;
-    my $ps = FileHandle->new;
-    open $ps, "/proc/$$/status";
-    my $vm = 0;
-    while (<$ps>) {
-        next unless /VmSize:\s+(\d+)/;
-        $vm = $1;
-        last;
-    }
-    $CPAN::Frontend->mywarn(sprintf(
-                                    "%-27s %6d\n%-27s %6d\n",
-                                    "vm",
-                                    $vm,
-                                    "CPAN::META",
-                                    Devel::Size::total_size($CPAN::META)/1024,
-                                   ));
-    for my $k (sort keys %$CPAN::META) {
-        next unless substr($k,0,4) eq "read";
-        warn sprintf " %-26s %6d\n", $k, Devel::Size::total_size($CPAN::META->{$k})/1024;
-        for my $k2 (sort keys %{$CPAN::META->{$k}}) {
-            warn sprintf "  %-25s %6d (keys: %6d)\n",
-                $k2,
-                    Devel::Size::total_size($CPAN::META->{$k}{$k2})/1024,
-                          scalar keys %{$CPAN::META->{$k}{$k2}};
-        }
-    }
-}
-
-# compare with install_tested
-#-> sub CPAN::Shell::is_tested
-sub is_tested {
-    my($self) = @_;
-    CPAN::Index->reload;
-    for my $b (reverse $CPAN::META->_list_sorted_descending_is_tested) {
-        my $time;
-        if ($CPAN::META->{is_tested}{$b}) {
-            $time = scalar(localtime $CPAN::META->{is_tested}{$b});
-        } else {
-            $time = scalar localtime;
-            $time =~ s/\S/?/g;
-        }
-        $CPAN::Frontend->myprint(sprintf "%s %s\n", $time, $b);
-    }
-}
-
-#-> sub CPAN::Shell::autobundle ;
-sub autobundle {
-    my($self) = shift;
-    CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
-    my(@bundle) = $self->_u_r_common("a",@_);
-    my($todir) = File::Spec->catdir($CPAN::Config->{'cpan_home'},"Bundle");
-    File::Path::mkpath($todir);
-    unless (-d $todir) {
-        $CPAN::Frontend->myprint("Couldn't mkdir $todir for some reason\n");
-        return;
-    }
-    my($y,$m,$d) =  (localtime)[5,4,3];
-    $y+=1900;
-    $m++;
-    my($c) = 0;
-    my($me) = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, $c;
-    my($to) = File::Spec->catfile($todir,"$me.pm");
-    while (-f $to) {
-        $me = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, ++$c;
-        $to = File::Spec->catfile($todir,"$me.pm");
-    }
-    my($fh) = FileHandle->new(">$to") or Carp::croak "Can't open >$to: $!";
-    $fh->print(
-               "package Bundle::$me;\n\n",
-               "\$VERSION = '0.01';\n\n",
-               "1;\n\n",
-               "__END__\n\n",
-               "=head1 NAME\n\n",
-               "Bundle::$me - Snapshot of installation on ",
-               $Config::Config{'myhostname'},
-               " on ",
-               scalar(localtime),
-               "\n\n=head1 SYNOPSIS\n\n",
-               "perl -MCPAN -e 'install Bundle::$me'\n\n",
-               "=head1 CONTENTS\n\n",
-               join("\n", @bundle),
-               "\n\n=head1 CONFIGURATION\n\n",
-               Config->myconfig,
-               "\n\n=head1 AUTHOR\n\n",
-               "This Bundle has been generated automatically ",
-               "by the autobundle routine in CPAN.pm.\n",
-              );
-    $fh->close;
-    $CPAN::Frontend->myprint("\nWrote bundle file
-    $to\n\n");
-}
-
-#-> sub CPAN::Shell::expandany ;
-sub expandany {
-    my($self,$s) = @_;
-    CPAN->debug("s[$s]") if $CPAN::DEBUG;
-    if ($s =~ m|/| or substr($s,-1,1) eq ".") { # looks like a file or a directory
-        $s = CPAN::Distribution->normalize($s);
-        return $CPAN::META->instance('CPAN::Distribution',$s);
-        # Distributions spring into existence, not expand
-    } elsif ($s =~ m|^Bundle::|) {
-        $self->local_bundles; # scanning so late for bundles seems
-                              # both attractive and crumpy: always
-                              # current state but easy to forget
-                              # somewhere
-        return $self->expand('Bundle',$s);
-    } else {
-        return $self->expand('Module',$s)
-            if $CPAN::META->exists('CPAN::Module',$s);
-    }
-    return;
-}
-
-#-> sub CPAN::Shell::expand ;
-sub expand {
-    my $self = shift;
-    my($type,@args) = @_;
-    CPAN->debug("type[$type]args[@args]") if $CPAN::DEBUG;
-    my $class = "CPAN::$type";
-    my $methods = ['id'];
-    for my $meth (qw(name)) {
-        next unless $class->can($meth);
-        push @$methods, $meth;
-    }
-    $self->expand_by_method($class,$methods,@args);
-}
-
-#-> sub CPAN::Shell::expand_by_method ;
-sub expand_by_method {
-    my $self = shift;
-    my($class,$methods,@args) = @_;
-    my($arg,@m);
-    for $arg (@args) {
-        my($regex,$command);
-        if ($arg =~ m|^/(.*)/$|) {
-            $regex = $1;
-# FIXME:  there seem to be some ='s in the author data, which trigger
-#         a failure here.  This needs to be contemplated.
-#            } elsif ($arg =~ m/=/) {
-#                $command = 1;
-        }
-        my $obj;
-        CPAN->debug(sprintf "class[%s]regex[%s]command[%s]",
-                    $class,
-                    defined $regex ? $regex : "UNDEFINED",
-                    defined $command ? $command : "UNDEFINED",
-                   ) if $CPAN::DEBUG;
-        if (defined $regex) {
-            if (CPAN::_sqlite_running) {
-                CPAN::Index->reload;
-                $CPAN::SQLite->search($class, $regex);
-            }
-            for $obj (
-                      $CPAN::META->all_objects($class)
-                     ) {
-                unless ($obj && UNIVERSAL::can($obj,"id") && $obj->id) {
-                    # BUG, we got an empty object somewhere
-                    require Data::Dumper;
-                    CPAN->debug(sprintf(
-                                        "Bug in CPAN: Empty id on obj[%s][%s]",
-                                        $obj,
-                                        Data::Dumper::Dumper($obj)
-                                       )) if $CPAN::DEBUG;
-                    next;
-                }
-                for my $method (@$methods) {
-                    my $match = eval {$obj->$method() =~ /$regex/i};
-                    if ($@) {
-                        my($err) = $@ =~ /^(.+) at .+? line \d+\.$/;
-                        $err ||= $@; # if we were too restrictive above
-                        $CPAN::Frontend->mydie("$err\n");
-                    } elsif ($match) {
-                        push @m, $obj;
-                        last;
-                    }
-                }
-            }
-        } elsif ($command) {
-            die "equal sign in command disabled (immature interface), ".
-                "you can set
- ! \$CPAN::Shell::ADVANCED_QUERY=1
-to enable it. But please note, this is HIGHLY EXPERIMENTAL code
-that may go away anytime.\n"
-                    unless $ADVANCED_QUERY;
-            my($method,$criterion) = $arg =~ /(.+?)=(.+)/;
-            my($matchcrit) = $criterion =~ m/^~(.+)/;
-            for my $self (
-                          sort
-                          {$a->id cmp $b->id}
-                          $CPAN::META->all_objects($class)
-                         ) {
-                my $lhs = $self->$method() or next; # () for 5.00503
-                if ($matchcrit) {
-                    push @m, $self if $lhs =~ m/$matchcrit/;
-                } else {
-                    push @m, $self if $lhs eq $criterion;
-                }
-            }
-        } else {
-            my($xarg) = $arg;
-            if ( $class eq 'CPAN::Bundle' ) {
-                $xarg =~ s/^(Bundle::)?(.*)/Bundle::$2/;
-            } elsif ($class eq "CPAN::Distribution") {
-                $xarg = CPAN::Distribution->normalize($arg);
-            } else {
-                $xarg =~ s/:+/::/g;
-            }
-            if ($CPAN::META->exists($class,$xarg)) {
-                $obj = $CPAN::META->instance($class,$xarg);
-            } elsif ($CPAN::META->exists($class,$arg)) {
-                $obj = $CPAN::META->instance($class,$arg);
-            } else {
-                next;
-            }
-            push @m, $obj;
-        }
-    }
-    @m = sort {$a->id cmp $b->id} @m;
-    if ( $CPAN::DEBUG ) {
-        my $wantarray = wantarray;
-        my $join_m = join ",", map {$_->id} @m;
-        # $self->debug("wantarray[$wantarray]join_m[$join_m]");
-        my $count = scalar @m;
-        $self->debug("class[$class]wantarray[$wantarray]count m[$count]");
-    }
-    return wantarray ? @m : $m[0];
-}
-
-#-> sub CPAN::Shell::format_result ;
-sub format_result {
-    my($self) = shift;
-    my($type,@args) = @_;
-    @args = '/./' unless @args;
-    my(@result) = $self->expand($type,@args);
-    my $result = @result == 1 ?
-        $result[0]->as_string :
-            @result == 0 ?
-                "No objects of type $type found for argument @args\n" :
-                    join("",
-                         (map {$_->as_glimpse} @result),
-                         scalar @result, " items found\n",
-                        );
-    $result;
-}
-
-#-> sub CPAN::Shell::report_fh ;
-{
-    my $installation_report_fh;
-    my $previously_noticed = 0;
-
-    sub report_fh {
-        return $installation_report_fh if $installation_report_fh;
-        if ($CPAN::META->has_usable("File::Temp")) {
-            $installation_report_fh
-                = File::Temp->new(
-                                  dir      => File::Spec->tmpdir,
-                                  template => 'cpan_install_XXXX',
-                                  suffix   => '.txt',
-                                  unlink   => 0,
-                                 );
-        }
-        unless ( $installation_report_fh ) {
-            warn("Couldn't open installation report file; " .
-                 "no report file will be generated."
-                ) unless $previously_noticed++;
-        }
-    }
-}
-
-
-# The only reason for this method is currently to have a reliable
-# debugging utility that reveals which output is going through which
-# channel. No, I don't like the colors ;-)
-
-# to turn colordebugging on, write
-# cpan> o conf colorize_output 1
-
-#-> sub CPAN::Shell::colorize_output ;
-{
-    my $print_ornamented_have_warned = 0;
-    sub colorize_output {
-        my $colorize_output = $CPAN::Config->{colorize_output};
-        if ($colorize_output && !$CPAN::META->has_inst("Term::ANSIColor")) {
-            unless ($print_ornamented_have_warned++) {
-                # no myprint/mywarn within myprint/mywarn!
-                warn "Colorize_output is set to true but Term::ANSIColor is not
-installed. To activate colorized output, please install Term::ANSIColor.\n\n";
-            }
-            $colorize_output = 0;
-        }
-        return $colorize_output;
-    }
-}
-
-
-#-> sub CPAN::Shell::print_ornamented ;
-sub print_ornamented {
-    my($self,$what,$ornament) = @_;
-    return unless defined $what;
-
-    local $| = 1; # Flush immediately
-    if ( $CPAN::Be_Silent ) {
-        print {report_fh()} $what;
-        return;
-    }
-    my $swhat = "$what"; # stringify if it is an object
-    if ($CPAN::Config->{term_is_latin}) {
-        # note: deprecated, need to switch to $LANG and $LC_*
-        # courtesy jhi:
-        $swhat
-            =~ s{([\xC0-\xDF])([\x80-\xBF])}{chr(ord($1)<<6&0xC0|ord($2)&0x3F)}eg; #};
-    }
-    if ($self->colorize_output) {
-        if ( $CPAN::DEBUG && $swhat =~ /^Debug\(/ ) {
-            # if you want to have this configurable, please file a bugreport
-            $ornament = $CPAN::Config->{colorize_debug} || "black on_cyan";
-        }
-        my $color_on = eval { Term::ANSIColor::color($ornament) } || "";
-        if ($@) {
-            print "Term::ANSIColor rejects color[$ornament]: $@\n
-Please choose a different color (Hint: try 'o conf init /color/')\n";
-        }
-        # GGOLDBACH/Test-GreaterVersion-0.008 broke without this
-        # $trailer construct. We want the newline be the last thing if
-        # there is a newline at the end ensuring that the next line is
-        # empty for other players
-        my $trailer = "";
-        $trailer = $1 if $swhat =~ s/([\r\n]+)\z//;
-        print $color_on,
-            $swhat,
-                Term::ANSIColor::color("reset"),
-                      $trailer;
-    } else {
-        print $swhat;
-    }
-}
-
-#-> sub CPAN::Shell::myprint ;
-
-# where is myprint/mywarn/Frontend/etc. documented? Where to use what?
-# I think, we send everything to STDOUT and use print for normal/good
-# news and warn for news that need more attention. Yes, this is our
-# working contract for now.
-sub myprint {
-    my($self,$what) = @_;
-    $self->print_ornamented($what,
-                            $CPAN::Config->{colorize_print}||'bold blue on_white',
-                           );
-}
-
-sub optprint {
-    my($self,$category,$what) = @_;
-    my $vname = $category . "_verbosity";
-    CPAN::HandleConfig->load unless $CPAN::Config_loaded++;
-    if (!$CPAN::Config->{$vname}
-        || $CPAN::Config->{$vname} =~ /^v/
-       ) {
-        $CPAN::Frontend->myprint($what);
-    }
-}
-
-#-> sub CPAN::Shell::myexit ;
-sub myexit {
-    my($self,$what) = @_;
-    $self->myprint($what);
-    exit;
-}
-
-#-> sub CPAN::Shell::mywarn ;
-sub mywarn {
-    my($self,$what) = @_;
-    $self->print_ornamented($what, $CPAN::Config->{colorize_warn}||'bold red on_white');
-}
-
-# only to be used for shell commands
-#-> sub CPAN::Shell::mydie ;
-sub mydie {
-    my($self,$what) = @_;
-    $self->mywarn($what);
-
-    # If it is the shell, we want the following die to be silent,
-    # but if it is not the shell, we would need a 'die $what'. We need
-    # to take care that only shell commands use mydie. Is this
-    # possible?
-
-    die "\n";
-}
-
-# sub CPAN::Shell::colorable_makemaker_prompt ;
-sub colorable_makemaker_prompt {
-    my($foo,$bar) = @_;
-    if (CPAN::Shell->colorize_output) {
-        my $ornament = $CPAN::Config->{colorize_print}||'bold blue on_white';
-        my $color_on = eval { Term::ANSIColor::color($ornament); } || "";
-        print $color_on;
-    }
-    my $ans = ExtUtils::MakeMaker::prompt($foo,$bar);
-    if (CPAN::Shell->colorize_output) {
-        print Term::ANSIColor::color('reset');
-    }
-    return $ans;
-}
-
-# use this only for unrecoverable errors!
-#-> sub CPAN::Shell::unrecoverable_error ;
-sub unrecoverable_error {
-    my($self,$what) = @_;
-    my @lines = split /\n/, $what;
-    my $longest = 0;
-    for my $l (@lines) {
-        $longest = length $l if length $l > $longest;
-    }
-    $longest = 62 if $longest > 62;
-    for my $l (@lines) {
-        if ($l =~ /^\s*$/) {
-            $l = "\n";
-            next;
-        }
-        $l = "==> $l";
-        if (length $l < 66) {
-            $l = pack "A66 A*", $l, "<==";
-        }
-        $l .= "\n";
-    }
-    unshift @lines, "\n";
-    $self->mydie(join "", @lines);
-}
-
-#-> sub CPAN::Shell::mysleep ;
-sub mysleep {
-    my($self, $sleep) = @_;
-    if (CPAN->has_inst("Time::HiRes")) {
-        Time::HiRes::sleep($sleep);
-    } else {
-        sleep($sleep < 1 ? 1 : int($sleep + 0.5));
-    }
-}
-
-#-> sub CPAN::Shell::setup_output ;
-sub setup_output {
-    return if -t STDOUT;
-    my $odef = select STDERR;
-    $| = 1;
-    select STDOUT;
-    $| = 1;
-    select $odef;
-}
-
-#-> sub CPAN::Shell::rematein ;
-# RE-adme||MA-ke||TE-st||IN-stall : nearly everything runs through here
-sub rematein {
-    my $self = shift;
-    my($meth,@some) = @_;
-    my @pragma;
-    while($meth =~ /^(ff?orce|notest)$/) {
-        push @pragma, $meth;
-        $meth = shift @some or
-            $CPAN::Frontend->mydie("Pragma $pragma[-1] used without method: ".
-                                   "cannot continue");
-    }
-    setup_output();
-    CPAN->debug("pragma[@pragma]meth[$meth]some[@some]") if $CPAN::DEBUG;
-
-    # Here is the place to set "test_count" on all involved parties to
-    # 0. We then can pass this counter on to the involved
-    # distributions and those can refuse to test if test_count > X. In
-    # the first stab at it we could use a 1 for "X".
-
-    # But when do I reset the distributions to start with 0 again?
-    # Jost suggested to have a random or cycling interaction ID that
-    # we pass through. But the ID is something that is just left lying
-    # around in addition to the counter, so I'd prefer to set the
-    # counter to 0 now, and repeat at the end of the loop. But what
-    # about dependencies? They appear later and are not reset, they
-    # enter the queue but not its copy. How do they get a sensible
-    # test_count?
-
-    # With configure_requires, "get" is vulnerable in recursion.
-
-    my $needs_recursion_protection = "get|make|test|install";
-
-    # construct the queue
-    my($s,@s,@qcopy);
-  STHING: foreach $s (@some) {
-        my $obj;
-        if (ref $s) {
-            CPAN->debug("s is an object[$s]") if $CPAN::DEBUG;
-            $obj = $s;
-        } elsif ($s =~ m|[\$\@\%]|) { # looks like a perl variable
-        } elsif ($s =~ m|^/|) { # looks like a regexp
-            if (substr($s,-1,1) eq ".") {
-                $obj = CPAN::Shell->expandany($s);
-            } else {
-                $CPAN::Frontend->mywarn("Sorry, $meth with a regular expression is ".
-                                        "not supported.\nRejecting argument '$s'\n");
-                $CPAN::Frontend->mysleep(2);
-                next;
-            }
-        } elsif ($meth eq "ls") {
-            $self->globls($s,\@pragma);
-            next STHING;
-        } else {
-            CPAN->debug("calling expandany [$s]") if $CPAN::DEBUG;
-            $obj = CPAN::Shell->expandany($s);
-        }
-        if (0) {
-        } elsif (ref $obj) {
-            if ($meth =~ /^($needs_recursion_protection)$/) {
-                # it would be silly to check for recursion for look or dump
-                # (we are in CPAN::Shell::rematein)
-                CPAN->debug("Going to test against recursion") if $CPAN::DEBUG;
-                eval {  $obj->color_cmd_tmps(0,1); };
-                if ($@) {
-                    if (ref $@
-                        and $@->isa("CPAN::Exception::RecursiveDependency")) {
-                        $CPAN::Frontend->mywarn($@);
-                    } else {
-                        if (0) {
-                            require Carp;
-                            Carp::confess(sprintf "DEBUG: \$\@[%s]ref[%s]", $@, ref $@);
-                        }
-                        die;
-                    }
-                }
-            }
-            CPAN::Queue->queue_item(qmod => $obj->id, reqtype => "c");
-            push @qcopy, $obj;
-        } elsif ($CPAN::META->exists('CPAN::Author',uc($s))) {
-            $obj = $CPAN::META->instance('CPAN::Author',uc($s));
-            if ($meth =~ /^(dump|ls|reports)$/) {
-                $obj->$meth();
-            } else {
-                $CPAN::Frontend->mywarn(
-                                        join "",
-                                        "Don't be silly, you can't $meth ",
-                                        $obj->fullname,
-                                        " ;-)\n"
-                                       );
-                $CPAN::Frontend->mysleep(2);
-            }
-        } elsif ($s =~ m|[\$\@\%]| && $meth eq "dump") {
-            CPAN::InfoObj->dump($s);
-        } else {
-            $CPAN::Frontend
-                ->mywarn(qq{Warning: Cannot $meth $s, }.
-                         qq{don't know what it is.
-Try the command
-
-    i /$s/
-
-to find objects with matching identifiers.
-});
-            $CPAN::Frontend->mysleep(2);
-        }
-    }
-
-    # queuerunner (please be warned: when I started to change the
-    # queue to hold objects instead of names, I made one or two
-    # mistakes and never found which. I reverted back instead)
-  QITEM: while (my $q = CPAN::Queue->first) {
-        my $obj;
-        my $s = $q->as_string;
-        my $reqtype = $q->reqtype || "";
-        $obj = CPAN::Shell->expandany($s);
-        unless ($obj) {
-            # don't know how this can happen, maybe we should panic,
-            # but maybe we get a solution from the first user who hits
-            # this unfortunate exception?
-            $CPAN::Frontend->mywarn("Warning: Could not expand string '$s' ".
-                                    "to an object. Skipping.\n");
-            $CPAN::Frontend->mysleep(5);
-            CPAN::Queue->delete_first($s);
-            next QITEM;
-        }
-        $obj->{reqtype} ||= "";
-        {
-            # force debugging because CPAN::SQLite somehow delivers us
-            # an empty object;
-
-            # local $CPAN::DEBUG = 1024; # Shell; probably fixed now
-
-            CPAN->debug("s[$s]obj-reqtype[$obj->{reqtype}]".
-                        "q-reqtype[$reqtype]") if $CPAN::DEBUG;
-        }
-        if ($obj->{reqtype}) {
-            if ($obj->{reqtype} eq "b" && $reqtype =~ /^[rc]$/) {
-                $obj->{reqtype} = $reqtype;
-                if (
-                    exists $obj->{install}
-                    &&
-                    (
-                     UNIVERSAL::can($obj->{install},"failed") ?
-                     $obj->{install}->failed :
-                     $obj->{install} =~ /^NO/
-                    )
-                   ) {
-                    delete $obj->{install};
-                    $CPAN::Frontend->mywarn
-                        ("Promoting $obj->{ID} from 'build_requires' to 'requires'");
-                }
-            }
-        } else {
-            $obj->{reqtype} = $reqtype;
-        }
-
-        for my $pragma (@pragma) {
-            if ($pragma
-                &&
-                $obj->can($pragma)) {
-                $obj->$pragma($meth);
-            }
-        }
-        if (UNIVERSAL::can($obj, 'called_for')) {
-            $obj->called_for($s);
-        }
-        CPAN->debug(qq{pragma[@pragma]meth[$meth]}.
-                    qq{ID[$obj->{ID}]}) if $CPAN::DEBUG;
-
-        push @qcopy, $obj;
-        if ($meth =~ /^(report)$/) { # they came here with a pragma?
-            $self->$meth($obj);
-        } elsif (! UNIVERSAL::can($obj,$meth)) {
-            # Must never happen
-            my $serialized = "";
-            if (0) {
-            } elsif ($CPAN::META->has_inst("YAML::Syck")) {
-                $serialized = YAML::Syck::Dump($obj);
-            } elsif ($CPAN::META->has_inst("YAML")) {
-                $serialized = YAML::Dump($obj);
-            } elsif ($CPAN::META->has_inst("Data::Dumper")) {
-                $serialized = Data::Dumper::Dumper($obj);
-            } else {
-                require overload;
-                $serialized = overload::StrVal($obj);
-            }
-            CPAN->debug("Going to panic. meth[$meth]s[$s]") if $CPAN::DEBUG;
-            $CPAN::Frontend->mydie("Panic: obj[$serialized] cannot meth[$meth]");
-        } elsif ($obj->$meth()) {
-            CPAN::Queue->delete($s);
-            CPAN->debug("From queue deleted. meth[$meth]s[$s]") if $CPAN::DEBUG;
-        } else {
-            CPAN->debug("Failed. pragma[@pragma]meth[$meth]") if $CPAN::DEBUG;
-        }
-
-        $obj->undelay;
-        for my $pragma (@pragma) {
-            my $unpragma = "un$pragma";
-            if ($obj->can($unpragma)) {
-                $obj->$unpragma();
-            }
-        }
-        if ($CPAN::Config->{halt_on_failure}
-                &&
-                    CPAN::Distrostatus::something_has_just_failed()
-              ) {
-            $CPAN::Frontend->mywarn("Stopping: '$meth' failed for '$s'.\n");
-            CPAN::Queue->nullify_queue;
-            last QITEM;
-        }
-        CPAN::Queue->delete_first($s);
-    }
-    if ($meth =~ /^($needs_recursion_protection)$/) {
-        for my $obj (@qcopy) {
-            $obj->color_cmd_tmps(0,0);
-        }
-    }
-}
-
-#-> sub CPAN::Shell::recent ;
-sub recent {
-  my($self) = @_;
-  if ($CPAN::META->has_inst("XML::LibXML")) {
-      my $url = $CPAN::Defaultrecent;
-      $CPAN::Frontend->myprint("Going to fetch '$url'\n");
-      unless ($CPAN::META->has_usable("LWP")) {
-          $CPAN::Frontend->mydie("LWP not installed; cannot continue");
-      }
-      CPAN::LWP::UserAgent->config;
-      my $Ua;
-      eval { $Ua = CPAN::LWP::UserAgent->new; };
-      if ($@) {
-          $CPAN::Frontend->mydie("CPAN::LWP::UserAgent->new dies with $@\n");
-      }
-      my $resp = $Ua->get($url);
-      unless ($resp->is_success) {
-          $CPAN::Frontend->mydie(sprintf "Could not download '%s': %s\n", $url, $resp->code);
-      }
-      $CPAN::Frontend->myprint("DONE\n\n");
-      my $xml = XML::LibXML->new->parse_string($resp->content);
-      if (0) {
-          my $s = $xml->serialize(2);
-          $s =~ s/\n\s*\n/\n/g;
-          $CPAN::Frontend->myprint($s);
-          return;
-      }
-      my @distros;
-      if ($url =~ /winnipeg/) {
-          my $pubdate = $xml->findvalue("/rss/channel/pubDate");
-          $CPAN::Frontend->myprint("    pubDate: $pubdate\n\n");
-          for my $eitem ($xml->findnodes("/rss/channel/item")) {
-              my $distro = $eitem->findvalue("enclosure/\@url");
-              $distro =~ s|.*?/authors/id/./../||;
-              my $size   = $eitem->findvalue("enclosure/\@length");
-              my $desc   = $eitem->findvalue("description");
-              $desc =~ s/.+? - //;
-              $CPAN::Frontend->myprint("$distro [$size b]\n    $desc\n");
-              push @distros, $distro;
-          }
-      } elsif ($url =~ /search.*uploads.rdf/) {
-          # xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-          # xmlns="http://purl.org/rss/1.0/"
-          # xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
-          # xmlns:dc="http://purl.org/dc/elements/1.1/"
-          # xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
-          # xmlns:admin="http://webns.net/mvcb/"
-
-
-          my $dc_date = $xml->findvalue("//*[local-name(.) = 'RDF']/*[local-name(.) = 'channel']/*[local-name(.) = 'date']");
-          $CPAN::Frontend->myprint("    dc:date: $dc_date\n\n");
-          my $finish_eitem = 0;
-          local $SIG{INT} = sub { $finish_eitem = 1 };
-        EITEM: for my $eitem ($xml->findnodes("//*[local-name(.) = 'RDF']/*[local-name(.) = 'item']")) {
-              my $distro = $eitem->findvalue("\@rdf:about");
-              $distro =~ s|.*~||; # remove up to the tilde before the name
-              $distro =~ s|/$||; # remove trailing slash
-              $distro =~ s|([^/]+)|\U$1\E|; # upcase the name
-              my $author = uc $1 or die "distro[$distro] without author, cannot continue";
-              my $desc   = $eitem->findvalue("*[local-name(.) = 'description']");
-              my $i = 0;
-            SUBDIRTEST: while () {
-                  last SUBDIRTEST if ++$i >= 6; # half a dozen must do!
-                  if (my @ret = $self->globls("$distro*")) {
-                      @ret = grep {$_->[2] !~ /meta/} @ret;
-                      @ret = grep {length $_->[2]} @ret;
-                      if (@ret) {
-                          $distro = "$author/$ret[0][2]";
-                          last SUBDIRTEST;
-                      }
-                  }
-                  $distro =~ s|/|/*/|; # allow it to reside in a subdirectory
-              }
-
-              next EITEM if $distro =~ m|\*|; # did not find the thing
-              $CPAN::Frontend->myprint("____$desc\n");
-              push @distros, $distro;
-              last EITEM if $finish_eitem;
-          }
-      }
-      return \@distros;
-  } else {
-      # deprecated old version
-      $CPAN::Frontend->mydie("no XML::LibXML installed, cannot continue\n");
-  }
-}
-
-#-> sub CPAN::Shell::smoke ;
-sub smoke {
-    my($self) = @_;
-    my $distros = $self->recent;
-  DISTRO: for my $distro (@$distros) {
-        next if $distro =~ m|/Bundle-|; # XXX crude heuristic to skip bundles
-        $CPAN::Frontend->myprint(sprintf "Going to download and test '$distro'\n");
-        {
-            my $skip = 0;
-            local $SIG{INT} = sub { $skip = 1 };
-            for (0..9) {
-                $CPAN::Frontend->myprint(sprintf "\r%2d (Hit ^C to skip)", 10-$_);
-                sleep 1;
-                if ($skip) {
-                    $CPAN::Frontend->myprint(" skipped\n");
-                    next DISTRO;
-                }
-            }
-        }
-        $CPAN::Frontend->myprint("\r  \n"); # leave the dirty line with a newline
-        $self->test($distro);
-    }
-}
-
-{
-    # set up the dispatching methods
-    no strict "refs";
-    for my $command (qw(
-                        clean
-                        cvs_import
-                        dump
-                        force
-                        fforce
-                        get
-                        install
-                        look
-                        ls
-                        make
-                        notest
-                        perldoc
-                        readme
-                        reports
-                        test
-                       )) {
-        *$command = sub { shift->rematein($command, @_); };
-    }
-}
-
-package CPAN::LWP::UserAgent;
-use strict;
-
-sub config {
-    return if $SETUPDONE;
-    if ($CPAN::META->has_usable('LWP::UserAgent')) {
-        require LWP::UserAgent;
-        @ISA = qw(Exporter LWP::UserAgent);
-        $SETUPDONE++;
-    } else {
-        $CPAN::Frontend->mywarn("  LWP::UserAgent not available\n");
-    }
-}
-
-sub get_basic_credentials {
-    my($self, $realm, $uri, $proxy) = @_;
-    if ($USER && $PASSWD) {
-        return ($USER, $PASSWD);
-    }
-    if ( $proxy ) {
-        ($USER,$PASSWD) = $self->get_proxy_credentials();
-    } else {
-        ($USER,$PASSWD) = $self->get_non_proxy_credentials();
-    }
-    return($USER,$PASSWD);
-}
-
-sub get_proxy_credentials {
-    my $self = shift;
-    my ($user, $password);
-    if ( defined $CPAN::Config->{proxy_user} ) {
-        $user = $CPAN::Config->{proxy_user};
-        $password = $CPAN::Config->{proxy_pass} || "";
-        return ($user, $password);
-    }
-    my $username_prompt = "\nProxy authentication needed!
- (Note: to permanently configure username and password run
-   o conf proxy_user your_username
-   o conf proxy_pass your_password
-     )\nUsername:";
-    ($user, $password) =
-        _get_username_and_password_from_user($username_prompt);
-    return ($user,$password);
-}
-
-sub get_non_proxy_credentials {
-    my $self = shift;
-    my ($user,$password);
-    if ( defined $CPAN::Config->{username} ) {
-        $user = $CPAN::Config->{username};
-        $password = $CPAN::Config->{password} || "";
-        return ($user, $password);
-    }
-    my $username_prompt = "\nAuthentication needed!
-     (Note: to permanently configure username and password run
-       o conf username your_username
-       o conf password your_password
-     )\nUsername:";
-
-    ($user, $password) =
-        _get_username_and_password_from_user($username_prompt);
-    return ($user,$password);
-}
-
-sub _get_username_and_password_from_user {
-    my $username_message = shift;
-    my ($username,$password);
-
-    ExtUtils::MakeMaker->import(qw(prompt));
-    $username = prompt($username_message);
-        if ($CPAN::META->has_inst("Term::ReadKey")) {
-            Term::ReadKey::ReadMode("noecho");
-        }
-    else {
-        $CPAN::Frontend->mywarn(
-            "Warning: Term::ReadKey seems not to be available, your password will be echoed to the terminal!\n"
-        );
-    }
-    $password = prompt("Password:");
-
-        if ($CPAN::META->has_inst("Term::ReadKey")) {
-            Term::ReadKey::ReadMode("restore");
-        }
-        $CPAN::Frontend->myprint("\n\n");
-    return ($username,$password);
-}
-
-# mirror(): Its purpose is to deal with proxy authentication. When we
-# call SUPER::mirror, we relly call the mirror method in
-# LWP::UserAgent. LWP::UserAgent will then call
-# $self->get_basic_credentials or some equivalent and this will be
-# $self->dispatched to our own get_basic_credentials method.
-
-# Our own get_basic_credentials sets $USER and $PASSWD, two globals.
-
-# 407 stands for HTTP_PROXY_AUTHENTICATION_REQUIRED. Which means
-# although we have gone through our get_basic_credentials, the proxy
-# server refuses to connect. This could be a case where the username or
-# password has changed in the meantime, so I'm trying once again without
-# $USER and $PASSWD to give the get_basic_credentials routine another
-# chance to set $USER and $PASSWD.
-
-# mirror(): Its purpose is to deal with proxy authentication. When we
-# call SUPER::mirror, we relly call the mirror method in
-# LWP::UserAgent. LWP::UserAgent will then call
-# $self->get_basic_credentials or some equivalent and this will be
-# $self->dispatched to our own get_basic_credentials method.
-
-# Our own get_basic_credentials sets $USER and $PASSWD, two globals.
-
-# 407 stands for HTTP_PROXY_AUTHENTICATION_REQUIRED. Which means
-# although we have gone through our get_basic_credentials, the proxy
-# server refuses to connect. This could be a case where the username or
-# password has changed in the meantime, so I'm trying once again without
-# $USER and $PASSWD to give the get_basic_credentials routine another
-# chance to set $USER and $PASSWD.
-
-sub mirror {
-    my($self,$url,$aslocal) = @_;
-    my $result = $self->SUPER::mirror($url,$aslocal);
-    if ($result->code == 407) {
-        undef $USER;
-        undef $PASSWD;
-        $result = $self->SUPER::mirror($url,$aslocal);
-    }
-    $result;
-}
-
-package CPAN::FTP;
-use strict;
-
-#-> sub CPAN::FTP::ftp_statistics
-# if they want to rewrite, they need to pass in a filehandle
-sub _ftp_statistics {
-    my($self,$fh) = @_;
-    my $locktype = $fh ? LOCK_EX : LOCK_SH;
-    $fh ||= FileHandle->new;
-    my $file = File::Spec->catfile($CPAN::Config->{cpan_home},"FTPstats.yml");
-    open $fh, "+>>$file" or $CPAN::Frontend->mydie("Could not open '$file': $!");
-    my $sleep = 1;
-    my $waitstart;
-    while (!CPAN::_flock($fh, $locktype|LOCK_NB)) {
-        $waitstart ||= localtime();
-        if ($sleep>3) {
-            $CPAN::Frontend->mywarn("Waiting for a read lock on '$file' (since $waitstart)\n");
-        }
-        $CPAN::Frontend->mysleep($sleep);
-        if ($sleep <= 3) {
-            $sleep+=0.33;
-        } elsif ($sleep <=6) {
-            $sleep+=0.11;
-        }
-    }
-    my $stats = eval { CPAN->_yaml_loadfile($file); };
-    if ($@) {
-        if (ref $@) {
-            if (ref $@ eq "CPAN::Exception::yaml_not_installed") {
-                $CPAN::Frontend->myprint("Warning (usually harmless): $@");
-                return;
-            } elsif (ref $@ eq "CPAN::Exception::yaml_process_error") {
-                $CPAN::Frontend->mydie($@);
-            }
-        } else {
-            $CPAN::Frontend->mydie($@);
-        }
-    }
-    return $stats->[0];
-}
-
-#-> sub CPAN::FTP::_mytime
-sub _mytime () {
-    if (CPAN->has_inst("Time::HiRes")) {
-        return Time::HiRes::time();
-    } else {
-        return time;
-    }
-}
-
-#-> sub CPAN::FTP::_new_stats
-sub _new_stats {
-    my($self,$file) = @_;
-    my $ret = {
-               file => $file,
-               attempts => [],
-               start => _mytime,
-              };
-    $ret;
-}
-
-#-> sub CPAN::FTP::_add_to_statistics
-sub _add_to_statistics {
-    my($self,$stats) = @_;
-    my $yaml_module = CPAN::_yaml_module;
-    $self->debug("yaml_module[$yaml_module]") if $CPAN::DEBUG;
-    if ($CPAN::META->has_inst($yaml_module)) {
-        $stats->{thesiteurl} = $ThesiteURL;
-        $stats->{end} = CPAN::FTP::_mytime();
-        my $fh = FileHandle->new;
-        my $time = time;
-        my $sdebug = 0;
-        my @debug;
-        @debug = $time if $sdebug;
-        my $fullstats = $self->_ftp_statistics($fh);
-        close $fh;
-        $fullstats->{history} ||= [];
-        push @debug, scalar @{$fullstats->{history}} if $sdebug;
-        push @debug, time if $sdebug;
-        push @{$fullstats->{history}}, $stats;
-        # YAML.pm 0.62 is unacceptably slow with 999;
-        # YAML::Syck 0.82 has no noticable performance problem with 999;
-        my $ftpstats_size = $CPAN::Config->{ftpstats_size} || 99;
-        my $ftpstats_period = $CPAN::Config->{ftpstats_period} || 14;
-        while (
-               @{$fullstats->{history}} > $ftpstats_size
-               || $time - $fullstats->{history}[0]{start} > 86400*$ftpstats_period
-              ) {
-            shift @{$fullstats->{history}}
-        }
-        push @debug, scalar @{$fullstats->{history}} if $sdebug;
-        push @debug, time if $sdebug;
-        push @debug, scalar localtime($fullstats->{history}[0]{start}) if $sdebug;
-        # need no eval because if this fails, it is serious
-        my $sfile = File::Spec->catfile($CPAN::Config->{cpan_home},"FTPstats.yml");
-        CPAN->_yaml_dumpfile("$sfile.$$",$fullstats);
-        if ( $sdebug ) {
-            local $CPAN::DEBUG = 512; # FTP
-            push @debug, time;
-            CPAN->debug(sprintf("DEBUG history: before_read[%d]before[%d]at[%d]".
-                                "after[%d]at[%d]oldest[%s]dumped backat[%d]",
-                                @debug,
-                               ));
-        }
-        # Win32 cannot rename a file to an existing filename
-        unlink($sfile) if ($^O eq 'MSWin32');
-       _copy_stat($sfile, "$sfile.$$") if -e $sfile;
-        rename "$sfile.$$", $sfile
-            or $CPAN::Frontend->mydie("Could not rename '$sfile.$$' to '$sfile': $!\n");
-    }
-}
-
-# Copy some stat information (owner, group, mode and) from one file to
-# another.
-# This is a utility function which might be moved to a utility repository.
-#-> sub CPAN::FTP::_copy_stat
-sub _copy_stat {
-    my($src, $dest) = @_;
-    my @stat = stat($src);
-    if (!@stat) {
-       $CPAN::Frontend->mywarn("Can't stat '$src': $!\n");
-       return;
-    }
-
-    eval {
-       chmod $stat[2], $dest
-           or $CPAN::Frontend->mywarn("Can't chmod '$dest' to " . sprintf("0%o", $stat[2]) . ": $!\n");
-    };
-    warn $@ if $@;
-    eval {
-       chown $stat[4], $stat[5], $dest
-           or do {
-               my $save_err = $!; # otherwise it's lost in the get... calls
-               $CPAN::Frontend->mywarn("Can't chown '$dest' to " .
-                                       (getpwuid($stat[4]))[0] . "/" .
-                                       (getgrgid($stat[5]))[0] . ": $save_err\n"
-                                      );
-           };
-    };
-    warn $@ if $@;
-}
-
-# if file is CHECKSUMS, suggest the place where we got the file to be
-# checked from, maybe only for young files?
-#-> sub CPAN::FTP::_recommend_url_for
-sub _recommend_url_for {
-    my($self, $file) = @_;
-    my $urllist = $self->_get_urllist;
-    if ($file =~ s|/CHECKSUMS(.gz)?$||) {
-        my $fullstats = $self->_ftp_statistics();
-        my $history = $fullstats->{history} || [];
-        while (my $last = pop @$history) {
-            last if $last->{end} - time > 3600; # only young results are interesting
-            next unless $last->{file}; # dirname of nothing dies!
-            next unless $file eq File::Basename::dirname($last->{file});
-            return $last->{thesiteurl};
-        }
-    }
-    if ($CPAN::Config->{randomize_urllist}
-        &&
-        rand(1) < $CPAN::Config->{randomize_urllist}
-       ) {
-        $urllist->[int rand scalar @$urllist];
-    } else {
-        return ();
-    }
-}
-
-#-> sub CPAN::FTP::_get_urllist
-sub _get_urllist {
-    my($self) = @_;
-    $CPAN::Config->{urllist} ||= [];
-    unless (ref $CPAN::Config->{urllist} eq 'ARRAY') {
-        $CPAN::Frontend->mywarn("Malformed urllist; ignoring.  Configuration file corrupt?\n");
-        $CPAN::Config->{urllist} = [];
-    }
-    my @urllist = grep { defined $_ and length $_ } @{$CPAN::Config->{urllist}};
-    for my $u (@urllist) {
-        CPAN->debug("u[$u]") if $CPAN::DEBUG;
-        if (UNIVERSAL::can($u,"text")) {
-            $u->{TEXT} .= "/" unless substr($u->{TEXT},-1) eq "/";
-        } else {
-            $u .= "/" unless substr($u,-1) eq "/";
-            $u = CPAN::URL->new(TEXT => $u, FROM => "USER");
-        }
-    }
-    \@urllist;
-}
-
-#-> sub CPAN::FTP::ftp_get ;
-sub ftp_get {
-    my($class,$host,$dir,$file,$target) = @_;
-    $class->debug(
-                  qq[Going to fetch file [$file] from dir [$dir]
-        on host [$host] as local [$target]\n]
-                 ) if $CPAN::DEBUG;
-    my $ftp = Net::FTP->new($host);
-    unless ($ftp) {
-        $CPAN::Frontend->mywarn("  Could not connect to host '$host' with Net::FTP\n");
-        return;
-    }
-    return 0 unless defined $ftp;
-    $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG;
-    $class->debug(qq[Going to login("anonymous","$Config::Config{cf_email}")]);
-    unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ) {
-        my $msg = $ftp->message;
-        $CPAN::Frontend->mywarn("  Couldn't login on $host: $msg");
-        return;
-    }
-    unless ( $ftp->cwd($dir) ) {
-        my $msg = $ftp->message;
-        $CPAN::Frontend->mywarn("  Couldn't cwd $dir: $msg");
-        return;
-    }
-    $ftp->binary;
-    $class->debug(qq[Going to ->get("$file","$target")\n]) if $CPAN::DEBUG;
-    unless ( $ftp->get($file,$target) ) {
-        my $msg = $ftp->message;
-        $CPAN::Frontend->mywarn("  Couldn't fetch $file from $host: $msg");
-        return;
-    }
-    $ftp->quit; # it's ok if this fails
-    return 1;
-}
-
-# If more accuracy is wanted/needed, Chris Leach sent me this patch...
-
- # > *** /install/perl/live/lib/CPAN.pm- Wed Sep 24 13:08:48 1997
- # > --- /tmp/cp Wed Sep 24 13:26:40 1997
- # > ***************
- # > *** 1562,1567 ****
- # > --- 1562,1580 ----
- # >       return 1 if substr($url,0,4) eq "file";
- # >       return 1 unless $url =~ m|://([^/]+)|;
- # >       my $host = $1;
- # > +     my $proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
- # > +     if ($proxy) {
- # > +         $proxy =~ m|://([^/:]+)|;
- # > +         $proxy = $1;
- # > +         my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'};
- # > +         if ($noproxy) {
- # > +             if ($host !~ /$noproxy$/) {
- # > +                 $host = $proxy;
- # > +             }
- # > +         } else {
- # > +             $host = $proxy;
- # > +         }
- # > +     }
- # >       require Net::Ping;
- # >       return 1 unless $Net::Ping::VERSION >= 2;
- # >       my $p;
-
-
-#-> sub CPAN::FTP::localize ;
-sub localize {
-    my($self,$file,$aslocal,$force) = @_;
-    $force ||= 0;
-    Carp::croak "Usage: ->localize(cpan_file,as_local_file[,$force])"
-        unless defined $aslocal;
-    $self->debug("file[$file] aslocal[$aslocal] force[$force]")
-        if $CPAN::DEBUG;
-
-    if ($^O eq 'MacOS') {
-        # Comment by AK on 2000-09-03: Uniq short filenames would be
-        # available in CHECKSUMS file
-        my($name, $path) = File::Basename::fileparse($aslocal, '');
-        if (length($name) > 31) {
-            $name =~ s/(
-                        \.(
-                           readme(\.(gz|Z))? |
-                           (tar\.)?(gz|Z) |
-                           tgz |
-                           zip |
-                           pm\.(gz|Z)
-                          )
-                       )$//x;
-            my $suf = $1;
-            my $size = 31 - length($suf);
-            while (length($name) > $size) {
-                chop $name;
-            }
-            $name .= $suf;
-            $aslocal = File::Spec->catfile($path, $name);
-        }
-    }
-
-    if (-f $aslocal && -r _ && !($force & 1)) {
-        my $size;
-        if ($size = -s $aslocal) {
-            $self->debug("aslocal[$aslocal]size[$size]") if $CPAN::DEBUG;
-            return $aslocal;
-        } else {
-            # empty file from a previous unsuccessful attempt to download it
-            unlink $aslocal or
-                $CPAN::Frontend->mydie("Found a zero-length '$aslocal' that I ".
-                                       "could not remove.");
-        }
-    }
-    my($maybe_restore) = 0;
-    if (-f $aslocal) {
-        rename $aslocal, "$aslocal.bak$$";
-        $maybe_restore++;
-    }
-
-    my($aslocal_dir) = File::Basename::dirname($aslocal);
-    $self->mymkpath($aslocal_dir); # too early for file URLs / RT #28438
-    # Inheritance is not easier to manage than a few if/else branches
-    if ($CPAN::META->has_usable('LWP::UserAgent')) {
-        unless ($Ua) {
-            CPAN::LWP::UserAgent->config;
-            eval {$Ua = CPAN::LWP::UserAgent->new;}; # Why is has_usable still not fit enough?
-            if ($@) {
-                $CPAN::Frontend->mywarn("CPAN::LWP::UserAgent->new dies with $@\n")
-                    if $CPAN::DEBUG;
-            } else {
-                my($var);
-                $Ua->proxy('ftp',  $var)
-                    if $var = $CPAN::Config->{ftp_proxy} || $ENV{ftp_proxy};
-                $Ua->proxy('http', $var)
-                    if $var = $CPAN::Config->{http_proxy} || $ENV{http_proxy};
-                $Ua->no_proxy($var)
-                    if $var = $CPAN::Config->{no_proxy} || $ENV{no_proxy};
-            }
-        }
-    }
-    for my $prx (qw(ftp_proxy http_proxy no_proxy)) {
-        $ENV{$prx} = $CPAN::Config->{$prx} if $CPAN::Config->{$prx};
-    }
-
-    # Try the list of urls for each single object. We keep a record
-    # where we did get a file from
-    my(@reordered,$last);
-    my $ccurllist = $self->_get_urllist;
-    $last = $#$ccurllist;
-    if ($force & 2) { # local cpans probably out of date, don't reorder
-        @reordered = (0..$last);
-    } else {
-        @reordered =
-            sort {
-                (substr($ccurllist->[$b],0,4) eq "file")
-                    <=>
-                (substr($ccurllist->[$a],0,4) eq "file")
-                    or
-                defined($ThesiteURL)
-                    and
-                ($ccurllist->[$b] eq $ThesiteURL)
-                    <=>
-                ($ccurllist->[$a] eq $ThesiteURL)
-            } 0..$last;
-    }
-    my(@levels);
-    $Themethod ||= "";
-    $self->debug("Themethod[$Themethod]reordered[@reordered]") if $CPAN::DEBUG;
-    my @all_levels = (
-                      ["dleasy",   "file"],
-                      ["dleasy"],
-                      ["dlhard"],
-                      ["dlhardest"],
-                      ["dleasy",   "http","defaultsites"],
-                      ["dlhard",   "http","defaultsites"],
-                      ["dleasy",   "ftp", "defaultsites"],
-                      ["dlhard",   "ftp", "defaultsites"],
-                      ["dlhardest","",    "defaultsites"],
-                     );
-    if ($Themethod) {
-        @levels = grep {$_->[0] eq $Themethod} @all_levels;
-        push @levels, grep {$_->[0] ne $Themethod} @all_levels;
-    } else {
-        @levels = @all_levels;
-    }
-    @levels = qw/dleasy/ if $^O eq 'MacOS';
-    my($levelno);
-    local $ENV{FTP_PASSIVE} =
-        exists $CPAN::Config->{ftp_passive} ?
-        $CPAN::Config->{ftp_passive} : 1;
-    my $ret;
-    my $stats = $self->_new_stats($file);
-    for ($CPAN::Config->{connect_to_internet_ok}) {
-        $connect_to_internet_ok = $_ if not defined $connect_to_internet_ok and defined $_;
-    }
-  LEVEL: for $levelno (0..$#levels) {
-        my $level_tuple = $levels[$levelno];
-        my($level,$scheme,$sitetag) = @$level_tuple;
-        my $defaultsites = $sitetag && $sitetag eq "defaultsites";
-        my @urllist;
-        if ($defaultsites) {
-            unless (defined $connect_to_internet_ok) {
-                $CPAN::Frontend->myprint(sprintf qq{
-I would like to connect to one of the following sites to get '%s':
-
-%s
-},
-                                         $file,
-                                         join("",map { " ".$_->text."\n" } @CPAN::Defaultsites),
-                                        );
-                my $answer = CPAN::Shell::colorable_makemaker_prompt("Is it OK to try to connect to the Internet?", "yes");
-                if ($answer =~ /^y/i) {
-                    $connect_to_internet_ok = 1;
-                } else {
-                    $connect_to_internet_ok = 0;
-                }
-            }
-            if ($connect_to_internet_ok) {
-                @urllist = @CPAN::Defaultsites;
-            } else {
-                my $sleep = 5;
-                $CPAN::Frontend->mywarn(sprintf qq{
-
-You have not configured a urllist and did not allow to connect to the
-internet. I will continue but it is very likely that we will face
-problems. If this happens, please consider to call either
-
-    o conf init connect_to_internet_ok
-or
-    o conf init urllist
-
-Sleeping $sleep seconds now.
-});
-                $CPAN::Frontend->mysleep($sleep);
-                @urllist = ();
-            }
-        } else {
-            my @host_seq = $level =~ /dleasy/ ?
-                @reordered : 0..$last;  # reordered has file and $Thesiteurl first
-            @urllist = map { $ccurllist->[$_] } @host_seq;
-        }
-        $self->debug("synth. urllist[@urllist]") if $CPAN::DEBUG;
-        my $aslocal_tempfile = $aslocal . ".tmp" . $$;
-        if (my $recommend = $self->_recommend_url_for($file)) {
-            @urllist = grep { $_ ne $recommend } @urllist;
-            unshift @urllist, $recommend;
-        }
-        $self->debug("synth. urllist[@urllist]") if $CPAN::DEBUG;
-        $ret = $self->hostdlxxx($level,$scheme,\@urllist,$file,$aslocal_tempfile,$stats);
-        if ($ret) {
-            CPAN->debug("ret[$ret]aslocal[$aslocal]") if $CPAN::DEBUG;
-            if ($ret eq $aslocal_tempfile) {
-                # if we got it exactly as we asked for, only then we
-                # want to rename
-                rename $aslocal_tempfile, $aslocal
-                    or $CPAN::Frontend->mydie("Error while trying to rename ".
-                                              "'$ret' to '$aslocal': $!");
-                $ret = $aslocal;
-            }
-            $Themethod = $level;
-            my $now = time;
-            # utime $now, $now, $aslocal; # too bad, if we do that, we
-                                          # might alter a local mirror
-            $self->debug("level[$level]") if $CPAN::DEBUG;
-            last LEVEL;
-        } else {
-            unlink $aslocal_tempfile;
-            last if $CPAN::Signal; # need to cleanup
-        }
-    }
-    if ($ret) {
-        $stats->{filesize} = -s $ret;
-    }
-    $self->debug("before _add_to_statistics") if $CPAN::DEBUG;
-    $self->_add_to_statistics($stats);
-    $self->debug("after _add_to_statistics") if $CPAN::DEBUG;
-    if ($ret) {
-        unlink "$aslocal.bak$$";
-        return $ret;
-    }
-    unless ($CPAN::Signal) {
-        my(@mess);
-        local $" = " ";
-        if (@{$CPAN::Config->{urllist}}) {
-            push @mess,
-                qq{Please check, if the URLs I found in your configuration file \(}.
-                    join(", ", @{$CPAN::Config->{urllist}}).
-                        qq{\) are valid.};
-        } else {
-            push @mess, qq{Your urllist is empty!};
-        }
-        push @mess, qq{The urllist can be edited.},
-            qq{E.g. with 'o conf urllist push ftp://myurl/'};
-        $CPAN::Frontend->mywarn(Text::Wrap::wrap("","","@mess"). "\n\n");
-        $CPAN::Frontend->mywarn("Could not fetch $file\n");
-        $CPAN::Frontend->mysleep(2);
-    }
-    if ($maybe_restore) {
-        rename "$aslocal.bak$$", $aslocal;
-        $CPAN::Frontend->myprint("Trying to get away with old file:\n" .
-                                 $self->ls($aslocal));
-        return $aslocal;
-    }
-    return;
-}
-
-sub mymkpath {
-    my($self, $aslocal_dir) = @_;
-    File::Path::mkpath($aslocal_dir);
-    $CPAN::Frontend->mywarn(qq{Warning: You are not allowed to write into }.
-                            qq{directory "$aslocal_dir".
-    I\'ll continue, but if you encounter problems, they may be due
-    to insufficient permissions.\n}) unless -w $aslocal_dir;
-}
-
-sub hostdlxxx {
-    my $self = shift;
-    my $level = shift;
-    my $scheme = shift;
-    my $h = shift;
-    $h = [ grep /^\Q$scheme\E:/, @$h ] if $scheme;
-    my $method = "host$level";
-    $self->$method($h, @_);
-}
-
-sub _set_attempt {
-    my($self,$stats,$method,$url) = @_;
-    push @{$stats->{attempts}}, {
-                                 method => $method,
-                                 start => _mytime,
-                                 url => $url,
-                                };
-}
-
-# package CPAN::FTP;
-sub hostdleasy {
-    my($self,$host_seq,$file,$aslocal,$stats) = @_;
-    my($ro_url);
-  HOSTEASY: for $ro_url (@$host_seq) {
-        $self->_set_attempt($stats,"dleasy",$ro_url);
-        my $url .= "$ro_url$file";
-        $self->debug("localizing perlish[$url]") if $CPAN::DEBUG;
-        if ($url =~ /^file:/) {
-            my $l;
-            if ($CPAN::META->has_inst('URI::URL')) {
-                my $u =  URI::URL->new($url);
-                $l = $u->path;
-            } else { # works only on Unix, is poorly constructed, but
-                # hopefully better than nothing.
-                # RFC 1738 says fileurl BNF is
-                # fileurl = "file://" [ host | "localhost" ] "/" fpath
-                # Thanks to "Mark D. Baushke" <mdb@cisco.com> for
-                # the code
-                ($l = $url) =~ s|^file://[^/]*/|/|; # discard the host part
-                $l =~ s|^file:||;                   # assume they
-                                                    # meant
-                                                    # file://localhost
-                $l =~ s|^/||s
-                    if ! -f $l && $l =~ m|^/\w:|;   # e.g. /P:
-            }
-            $self->debug("local file[$l]") if $CPAN::DEBUG;
-            if ( -f $l && -r _) {
-                $ThesiteURL = $ro_url;
-                return $l;
-            }
-            if ($l =~ /(.+)\.gz$/) {
-                my $ungz = $1;
-                if ( -f $ungz && -r _) {
-                    $ThesiteURL = $ro_url;
-                    return $ungz;
-                }
-            }
-            # Maybe mirror has compressed it?
-            if (-f "$l.gz") {
-                $self->debug("found compressed $l.gz") if $CPAN::DEBUG;
-                eval { CPAN::Tarzip->new("$l.gz")->gunzip($aslocal) };
-                if ( -f $aslocal) {
-                    $ThesiteURL = $ro_url;
-                    return $aslocal;
-                }
-            }
-            $CPAN::Frontend->mywarn("Could not find '$l'\n");
-        }
-        $self->debug("it was not a file URL") if $CPAN::DEBUG;
-        if ($CPAN::META->has_usable('LWP')) {
-            $CPAN::Frontend->myprint("Fetching with LWP:
-  $url
-");
-            unless ($Ua) {
-                CPAN::LWP::UserAgent->config;
-                eval { $Ua = CPAN::LWP::UserAgent->new; };
-                if ($@) {
-                    $CPAN::Frontend->mywarn("CPAN::LWP::UserAgent->new dies with $@\n");
-                }
-            }
-            my $res = $Ua->mirror($url, $aslocal);
-            if ($res->is_success) {
-                $ThesiteURL = $ro_url;
-                my $now = time;
-                utime $now, $now, $aslocal; # download time is more
-                                            # important than upload
-                                            # time
-                return $aslocal;
-            } elsif ($url !~ /\.gz(?!\n)\Z/) {
-                my $gzurl = "$url.gz";
-                $CPAN::Frontend->myprint("Fetching with LWP:
-  $gzurl
-");
-                $res = $Ua->mirror($gzurl, "$aslocal.gz");
-                if ($res->is_success) {
-                    if (eval {CPAN::Tarzip->new("$aslocal.gz")->gunzip($aslocal)}) {
-                        $ThesiteURL = $ro_url;
-                        return $aslocal;
-                    }
-                }
-            } else {
-                $CPAN::Frontend->myprint(sprintf(
-                                                 "LWP failed with code[%s] message[%s]\n",
-                                                 $res->code,
-                                                 $res->message,
-                                                ));
-                # Alan Burlison informed me that in firewall environments
-                # Net::FTP can still succeed where LWP fails. So we do not
-                # skip Net::FTP anymore when LWP is available.
-            }
-        } else {
-            $CPAN::Frontend->mywarn("  LWP not available\n");
-        }
-        return if $CPAN::Signal;
-        if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
-            # that's the nice and easy way thanks to Graham
-            $self->debug("recognized ftp") if $CPAN::DEBUG;
-            my($host,$dir,$getfile) = ($1,$2,$3);
-            if ($CPAN::META->has_usable('Net::FTP')) {
-                $dir =~ s|/+|/|g;
-                $CPAN::Frontend->myprint("Fetching with Net::FTP:
-  $url
-");
-                $self->debug("getfile[$getfile]dir[$dir]host[$host]" .
-                             "aslocal[$aslocal]") if $CPAN::DEBUG;
-                if (CPAN::FTP->ftp_get($host,$dir,$getfile,$aslocal)) {
-                    $ThesiteURL = $ro_url;
-                    return $aslocal;
-                }
-                if ($aslocal !~ /\.gz(?!\n)\Z/) {
-                    my $gz = "$aslocal.gz";
-                    $CPAN::Frontend->myprint("Fetching with Net::FTP
-  $url.gz
-");
-                    if (CPAN::FTP->ftp_get($host,
-                                           $dir,
-                                           "$getfile.gz",
-                                           $gz) &&
-                        eval{CPAN::Tarzip->new($gz)->gunzip($aslocal)}
-                    ) {
-                        $ThesiteURL = $ro_url;
-                        return $aslocal;
-                    }
-                }
-                # next HOSTEASY;
-            } else {
-                CPAN->debug("Net::FTP does not count as usable atm") if $CPAN::DEBUG;
-            }
-        }
-        if (
-            UNIVERSAL::can($ro_url,"text")
-            and
-            $ro_url->{FROM} eq "USER"
-           ) {
-            ##address #17973: default URLs should not try to override
-            ##user-defined URLs just because LWP is not available
-            my $ret = $self->hostdlhard([$ro_url],$file,$aslocal,$stats);
-            return $ret if $ret;
-        }
-        return if $CPAN::Signal;
-    }
-}
-
-# package CPAN::FTP;
-sub hostdlhard {
-    my($self,$host_seq,$file,$aslocal,$stats) = @_;
-
-    # Came back if Net::FTP couldn't establish connection (or
-    # failed otherwise) Maybe they are behind a firewall, but they
-    # gave us a socksified (or other) ftp program...
-
-    my($ro_url);
-    my($devnull) = $CPAN::Config->{devnull} || "";
-    # < /dev/null ";
-    my($aslocal_dir) = File::Basename::dirname($aslocal);
-    File::Path::mkpath($aslocal_dir);
-  HOSTHARD: for $ro_url (@$host_seq) {
-        $self->_set_attempt($stats,"dlhard",$ro_url);
-        my $url = "$ro_url$file";
-        my($proto,$host,$dir,$getfile);
-
-        # Courtesy Mark Conty mark_conty@cargill.com change from
-        # if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
-        # to
-        if ($url =~ m|^([^:]+)://(.*?)/(.*)/(.*)|) {
-            # proto not yet used
-            ($proto,$host,$dir,$getfile) = ($1,$2,$3,$4);
-        } else {
-            next HOSTHARD; # who said, we could ftp anything except ftp?
-        }
-        next HOSTHARD if $proto eq "file"; # file URLs would have had
-                                           # success above. Likely a bogus URL
-
-        $self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG;
-
-        # Try the most capable first and leave ncftp* for last as it only
-        # does FTP.
-        my $proxy_vars = $self->_proxy_vars($ro_url);
-      DLPRG: for my $f (qw(curl wget lynx ncftpget ncftp)) {
-            my $funkyftp = CPAN::HandleConfig->safe_quote($CPAN::Config->{$f});
-            next unless defined $funkyftp;
-            next if $funkyftp =~ /^\s*$/;
-
-            my($asl_ungz, $asl_gz);
-            ($asl_ungz = $aslocal) =~ s/\.gz//;
-                $asl_gz = "$asl_ungz.gz";
-
-            my($src_switch) = "";
-            my($chdir) = "";
-            my($stdout_redir) = " > $asl_ungz";
-            if ($f eq "lynx") {
-                $src_switch = " -source";
-            } elsif ($f eq "ncftp") {
-                $src_switch = " -c";
-            } elsif ($f eq "wget") {
-                $src_switch = " -O $asl_ungz";
-                $stdout_redir = "";
-            } elsif ($f eq 'curl') {
-                $src_switch = ' -L -f -s -S --netrc-optional';
-                if ($proxy_vars->{http_proxy}) {
-                    $src_switch .= qq{ -U "$proxy_vars->{proxy_user}:$proxy_vars->{proxy_pass}" -x "$proxy_vars->{http_proxy}"};
-                }
-            }
-
-            if ($f eq "ncftpget") {
-                $chdir = "cd $aslocal_dir && ";
-                $stdout_redir = "";
-            }
-            $CPAN::Frontend->myprint(
-                                     qq[
-Trying with "$funkyftp$src_switch" to get
-    $url
-]);
-            my($system) =
-                "$chdir$funkyftp$src_switch \"$url\" $devnull$stdout_redir";
-            $self->debug("system[$system]") if $CPAN::DEBUG;
-            my($wstatus) = system($system);
-            if ($f eq "lynx") {
-                # lynx returns 0 when it fails somewhere
-                if (-s $asl_ungz) {
-                    my $content = do { local *FH;
-                                       open FH, $asl_ungz or die;
-                                       local $/;
-                                       <FH> };
-                    if ($content =~ /^<.*(<title>[45]|Error [45])/si) {
-                        $CPAN::Frontend->mywarn(qq{
-No success, the file that lynx has downloaded looks like an error message:
-$content
-});
-                        $CPAN::Frontend->mysleep(1);
-                        next DLPRG;
-                    }
-                } else {
-                    $CPAN::Frontend->myprint(qq{
-No success, the file that lynx has downloaded is an empty file.
-});
-                    next DLPRG;
-                }
-            }
-            if ($wstatus == 0) {
-                if (-s $aslocal) {
-                    # Looks good
-                } elsif ($asl_ungz ne $aslocal) {
-                    # test gzip integrity
-                    if (eval{CPAN::Tarzip->new($asl_ungz)->gtest}) {
-                        # e.g. foo.tar is gzipped --> foo.tar.gz
-                        rename $asl_ungz, $aslocal;
-                    } else {
-                        eval{CPAN::Tarzip->new($asl_gz)->gzip($asl_ungz)};
-                    }
-                }
-                $ThesiteURL = $ro_url;
-                return $aslocal;
-            } elsif ($url !~ /\.gz(?!\n)\Z/) {
-                unlink $asl_ungz if
-                    -f $asl_ungz && -s _ == 0;
-                my $gz = "$aslocal.gz";
-                my $gzurl = "$url.gz";
-                $CPAN::Frontend->myprint(
-                                        qq[
-    Trying with "$funkyftp$src_switch" to get
-    $url.gz
-    ]);
-                my($system) = "$funkyftp$src_switch \"$url.gz\" $devnull > $asl_gz";
-                $self->debug("system[$system]") if $CPAN::DEBUG;
-                my($wstatus);
-                if (($wstatus = system($system)) == 0
-                    &&
-                    -s $asl_gz
-                ) {
-                    # test gzip integrity
-                    my $ct = eval{CPAN::Tarzip->new($asl_gz)};
-                    if ($ct && $ct->gtest) {
-                        $ct->gunzip($aslocal);
-                    } else {
-                        # somebody uncompressed file for us?
-                        rename $asl_ungz, $aslocal;
-                    }
-                    $ThesiteURL = $ro_url;
-                    return $aslocal;
-                } else {
-                    unlink $asl_gz if -f $asl_gz;
-                }
-            } else {
-                my $estatus = $wstatus >> 8;
-                my $size = -f $aslocal ?
-                    ", left\n$aslocal with size ".-s _ :
-                    "\nWarning: expected file [$aslocal] doesn't exist";
-                $CPAN::Frontend->myprint(qq{
-    System call "$system"
-    returned status $estatus (wstat $wstatus)$size
-    });
-            }
-            return if $CPAN::Signal;
-        } # transfer programs
-    } # host
-}
-
-#-> CPAN::FTP::_proxy_vars
-sub _proxy_vars {
-    my($self,$url) = @_;
-    my $ret = +{};
-    my $http_proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'};
-    if ($http_proxy) {
-        my($host) = $url =~ m|://([^/:]+)|;
-        my $want_proxy = 1;
-        my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'} || "";
-        my @noproxy = split /\s*,\s*/, $noproxy;
-        if ($host) {
-          DOMAIN: for my $domain (@noproxy) {
-                if ($host =~ /\Q$domain\E$/) { # cf. LWP::UserAgent
-                    $want_proxy = 0;
-                    last DOMAIN;
-                }
-            }
-        } else {
-            $CPAN::Frontend->mywarn("  Could not determine host from http_proxy '$http_proxy'\n");
-        }
-        if ($want_proxy) {
-            my($user, $pass) =
-                &CPAN::LWP::UserAgent::get_proxy_credentials();
-            $ret = {
-                    proxy_user => $user,
-                    proxy_pass => $pass,
-                    http_proxy => $http_proxy
-                  };
-        }
-    }
-    return $ret;
-}
-
-# package CPAN::FTP;
-sub hostdlhardest {
-    my($self,$host_seq,$file,$aslocal,$stats) = @_;
-
-    return unless @$host_seq;
-    my($ro_url);
-    my($aslocal_dir) = File::Basename::dirname($aslocal);
-    File::Path::mkpath($aslocal_dir);
-    my $ftpbin = $CPAN::Config->{ftp};
-    unless ($ftpbin && length $ftpbin && MM->maybe_command($ftpbin)) {
-        $CPAN::Frontend->myprint("No external ftp command available\n\n");
-        return;
-    }
-    $CPAN::Frontend->mywarn(qq{
-As a last ressort we now switch to the external ftp command '$ftpbin'
-to get '$aslocal'.
-
-Doing so often leads to problems that are hard to diagnose.
-
-If you're victim of such problems, please consider unsetting the ftp
-config variable with
-
-    o conf ftp ""
-    o conf commit
-
-});
-    $CPAN::Frontend->mysleep(2);
-  HOSTHARDEST: for $ro_url (@$host_seq) {
-        $self->_set_attempt($stats,"dlhardest",$ro_url);
-        my $url = "$ro_url$file";
-        $self->debug("localizing ftpwise[$url]") if $CPAN::DEBUG;
-        unless ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) {
-            next;
-        }
-        my($host,$dir,$getfile) = ($1,$2,$3);
-        my $timestamp = 0;
-        my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
-            $ctime,$blksize,$blocks) = stat($aslocal);
-        $timestamp = $mtime ||= 0;
-        my($netrc) = CPAN::FTP::netrc->new;
-        my($netrcfile) = $netrc->netrc;
-        my($verbose) = $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG ? " -v" : "";
-        my $targetfile = File::Basename::basename($aslocal);
-        my(@dialog);
-        push(
-             @dialog,
-             "lcd $aslocal_dir",
-             "cd /",
-             map("cd $_", split /\//, $dir), # RFC 1738
-             "bin",
-             "get $getfile $targetfile",
-             "quit"
-        );
-        if (! $netrcfile) {
-            CPAN->debug("No ~/.netrc file found") if $CPAN::DEBUG;
-        } elsif ($netrc->hasdefault || $netrc->contains($host)) {
-            CPAN->debug(sprintf("hasdef[%d]cont($host)[%d]",
-                                $netrc->hasdefault,
-                                $netrc->contains($host))) if $CPAN::DEBUG;
-            if ($netrc->protected) {
-                my $dialog = join "", map { "    $_\n" } @dialog;
-                my $netrc_explain;
-                if ($netrc->contains($host)) {
-                    $netrc_explain = "Relying that your .netrc entry for '$host' ".
-                        "manages the login";
-                } else {
-                    $netrc_explain = "Relying that your default .netrc entry ".
-                        "manages the login";
-                }
-                $CPAN::Frontend->myprint(qq{
-  Trying with external ftp to get
-    $url
-  $netrc_explain
-  Going to send the dialog
-$dialog
-}
-                );
-                $self->talk_ftp("$ftpbin$verbose $host",
-                                @dialog);
-                ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
-                    $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal);
-                $mtime ||= 0;
-                if ($mtime > $timestamp) {
-                    $CPAN::Frontend->myprint("GOT $aslocal\n");
-                    $ThesiteURL = $ro_url;
-                    return $aslocal;
-                } else {
-                    $CPAN::Frontend->myprint("Hmm... Still failed!\n");
-                }
-                    return if $CPAN::Signal;
-            } else {
-                $CPAN::Frontend->mywarn(qq{Your $netrcfile is not }.
-                                        qq{correctly protected.\n});
-            }
-        } else {
-            $CPAN::Frontend->mywarn("Your ~/.netrc neither contains $host
-  nor does it have a default entry\n");
-        }
-
-        # OK, they don't have a valid ~/.netrc. Use 'ftp -n'
-        # then and login manually to host, using e-mail as
-        # password.
-        $CPAN::Frontend->myprint(qq{Issuing "$ftpbin$verbose -n"\n});
-        unshift(
-                @dialog,
-                "open $host",
-                "user anonymous $Config::Config{'cf_email'}"
-        );
-        my $dialog = join "", map { "    $_\n" } @dialog;
-        $CPAN::Frontend->myprint(qq{
-  Trying with external ftp to get
-    $url
-  Going to send the dialog
-$dialog
-}
-        );
-        $self->talk_ftp("$ftpbin$verbose -n", @dialog);
-        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
-            $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal);
-        $mtime ||= 0;
-        if ($mtime > $timestamp) {
-            $CPAN::Frontend->myprint("GOT $aslocal\n");
-            $ThesiteURL = $ro_url;
-            return $aslocal;
-        } else {
-            $CPAN::Frontend->myprint("Bad luck... Still failed!\n");
-        }
-        return if $CPAN::Signal;
-        $CPAN::Frontend->mywarn("Can't access URL $url.\n\n");
-        $CPAN::Frontend->mysleep(2);
-    } # host
-}
-
-# package CPAN::FTP;
-sub talk_ftp {
-    my($self,$command,@dialog) = @_;
-    my $fh = FileHandle->new;
-    $fh->open("|$command") or die "Couldn't open ftp: $!";
-    foreach (@dialog) { $fh->print("$_\n") }
-    $fh->close; # Wait for process to complete
-    my $wstatus = $?;
-    my $estatus = $wstatus >> 8;
-    $CPAN::Frontend->myprint(qq{
-Subprocess "|$command"
-  returned status $estatus (wstat $wstatus)
-}) if $wstatus;
-}
-
-# find2perl needs modularization, too, all the following is stolen
-# from there
-# CPAN::FTP::ls
-sub ls {
-    my($self,$name) = @_;
-    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizemm,
-     $atime,$mtime,$ctime,$blksize,$blocks) = lstat($name);
-
-    my($perms,%user,%group);
-    my $pname = $name;
-
-    if ($blocks) {
-        $blocks = int(($blocks + 1) / 2);
-    }
-    else {
-        $blocks = int(($sizemm + 1023) / 1024);
-    }
-
-    if    (-f _) { $perms = '-'; }
-    elsif (-d _) { $perms = 'd'; }
-    elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; }
-    elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; }
-    elsif (-p _) { $perms = 'p'; }
-    elsif (-S _) { $perms = 's'; }
-    else         { $perms = 'l'; $pname .= ' -> ' . readlink($_); }
-
-    my(@rwx) = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
-    my(@moname) = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
-    my $tmpmode = $mode;
-    my $tmp = $rwx[$tmpmode & 7];
-    $tmpmode >>= 3;
-    $tmp = $rwx[$tmpmode & 7] . $tmp;
-    $tmpmode >>= 3;
-    $tmp = $rwx[$tmpmode & 7] . $tmp;
-    substr($tmp,2,1) =~ tr/-x/Ss/ if -u _;
-    substr($tmp,5,1) =~ tr/-x/Ss/ if -g _;
-    substr($tmp,8,1) =~ tr/-x/Tt/ if -k _;
-    $perms .= $tmp;
-
-    my $user = $user{$uid} || $uid;   # too lazy to implement lookup
-    my $group = $group{$gid} || $gid;
-
-    my($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime);
-    my($timeyear);
-    my($moname) = $moname[$mon];
-    if (-M _ > 365.25 / 2) {
-        $timeyear = $year + 1900;
-    }
-    else {
-        $timeyear = sprintf("%02d:%02d", $hour, $min);
-    }
-
-    sprintf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n",
-             $ino,
-                  $blocks,
-                       $perms,
-                             $nlink,
-                                 $user,
-                                      $group,
-                                           $sizemm,
-                                               $moname,
-                                                  $mday,
-                                                      $timeyear,
-                                                          $pname;
-}
-
-package CPAN::FTP::netrc;
-use strict;
-
-# package CPAN::FTP::netrc;
-sub new {
-    my($class) = @_;
-    my $home = CPAN::HandleConfig::home;
-    my $file = File::Spec->catfile($home,".netrc");
-
-    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
-       $atime,$mtime,$ctime,$blksize,$blocks)
-        = stat($file);
-    $mode ||= 0;
-    my $protected = 0;
-
-    my($fh,@machines,$hasdefault);
-    $hasdefault = 0;
-    $fh = FileHandle->new or die "Could not create a filehandle";
-
-    if($fh->open($file)) {
-        $protected = ($mode & 077) == 0;
-        local($/) = "";
-      NETRC: while (<$fh>) {
-            my(@tokens) = split " ", $_;
-          TOKEN: while (@tokens) {
-                my($t) = shift @tokens;
-                if ($t eq "default") {
-                    $hasdefault++;
-                    last NETRC;
-                }
-                last TOKEN if $t eq "macdef";
-                if ($t eq "machine") {
-                    push @machines, shift @tokens;
-                }
-            }
-        }
-    } else {
-        $file = $hasdefault = $protected = "";
-    }
-
-    bless {
-        'mach' => [@machines],
-        'netrc' => $file,
-        'hasdefault' => $hasdefault,
-        'protected' => $protected,
-    }, $class;
-}
-
-# CPAN::FTP::netrc::hasdefault;
-sub hasdefault { shift->{'hasdefault'} }
-sub netrc      { shift->{'netrc'}      }
-sub protected  { shift->{'protected'}  }
-sub contains {
-    my($self,$mach) = @_;
-    for ( @{$self->{'mach'}} ) {
-        return 1 if $_ eq $mach;
-    }
-    return 0;
-}
-
-package CPAN::Complete;
-use strict;
-
-sub gnu_cpl {
-    my($text, $line, $start, $end) = @_;
-    my(@perlret) = cpl($text, $line, $start);
-    # find longest common match. Can anybody show me how to peruse
-    # T::R::Gnu to have this done automatically? Seems expensive.
-    return () unless @perlret;
-    my($newtext) = $text;
-    for (my $i = length($text)+1;;$i++) {
-        last unless length($perlret[0]) && length($perlret[0]) >= $i;
-        my $try = substr($perlret[0],0,$i);
-        my @tries = grep {substr($_,0,$i) eq $try} @perlret;
-        # warn "try[$try]tries[@tries]";
-        if (@tries == @perlret) {
-            $newtext = $try;
-        } else {
-            last;
-        }
-    }
-    ($newtext,@perlret);
-}
-
-#-> sub CPAN::Complete::cpl ;
-sub cpl {
-    my($word,$line,$pos) = @_;
-    $word ||= "";
-    $line ||= "";
-    $pos ||= 0;
-    CPAN->debug("word [$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
-    $line =~ s/^\s*//;
-    if ($line =~ s/^((?:notest|f?force)\s*)//) {
-        $pos -= length($1);
-    }
-    my @return;
-    if ($pos == 0 || $line =~ /^(?:h(?:elp)?|\?)\s/) {
-        @return = grep /^\Q$word\E/, @CPAN::Complete::COMMANDS;
-    } elsif ( $line !~ /^[\!abcdghimorutl]/ ) {
-        @return = ();
-    } elsif ($line =~ /^(a|ls)\s/) {
-        @return = cplx('CPAN::Author',uc($word));
-    } elsif ($line =~ /^b\s/) {
-        CPAN::Shell->local_bundles;
-        @return = cplx('CPAN::Bundle',$word);
-    } elsif ($line =~ /^d\s/) {
-        @return = cplx('CPAN::Distribution',$word);
-    } elsif ($line =~ m/^(
-                          [mru]|make|clean|dump|get|test|install|readme|look|cvs_import|perldoc|recent
-                         )\s/x ) {
-        if ($word =~ /^Bundle::/) {
-            CPAN::Shell->local_bundles;
-        }
-        @return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
-    } elsif ($line =~ /^i\s/) {
-        @return = cpl_any($word);
-    } elsif ($line =~ /^reload\s/) {
-        @return = cpl_reload($word,$line,$pos);
-    } elsif ($line =~ /^o\s/) {
-        @return = cpl_option($word,$line,$pos);
-    } elsif ($line =~ m/^\S+\s/ ) {
-        # fallback for future commands and what we have forgotten above
-        @return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word));
-    } else {
-        @return = ();
-    }
-    return @return;
-}
-
-#-> sub CPAN::Complete::cplx ;
-sub cplx {
-    my($class, $word) = @_;
-    if (CPAN::_sqlite_running) {
-        $CPAN::SQLite->search($class, "^\Q$word\E");
-    }
-    sort grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class);
-}
-
-#-> sub CPAN::Complete::cpl_any ;
-sub cpl_any {
-    my($word) = shift;
-    return (
-            cplx('CPAN::Author',$word),
-            cplx('CPAN::Bundle',$word),
-            cplx('CPAN::Distribution',$word),
-            cplx('CPAN::Module',$word),
-           );
-}
-
-#-> sub CPAN::Complete::cpl_reload ;
-sub cpl_reload {
-    my($word,$line,$pos) = @_;
-    $word ||= "";
-    my(@words) = split " ", $line;
-    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
-    my(@ok) = qw(cpan index);
-    return @ok if @words == 1;
-    return grep /^\Q$word\E/, @ok if @words == 2 && $word;
-}
-
-#-> sub CPAN::Complete::cpl_option ;
-sub cpl_option {
-    my($word,$line,$pos) = @_;
-    $word ||= "";
-    my(@words) = split " ", $line;
-    CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG;
-    my(@ok) = qw(conf debug);
-    return @ok if @words == 1;
-    return grep /^\Q$word\E/, @ok if @words == 2 && length($word);
-    if (0) {
-    } elsif ($words[1] eq 'index') {
-        return ();
-    } elsif ($words[1] eq 'conf') {
-        return CPAN::HandleConfig::cpl(@_);
-    } elsif ($words[1] eq 'debug') {
-        return sort grep /^\Q$word\E/i,
-            sort keys %CPAN::DEBUG, 'all';
-    }
-}
-
-package CPAN::Index;
-use strict;
-
-#-> sub CPAN::Index::force_reload ;
-sub force_reload {
-    my($class) = @_;
-    $CPAN::Index::LAST_TIME = 0;
-    $class->reload(1);
-}
-
-#-> sub CPAN::Index::reload ;
-sub reload {
-    my($self,$force) = @_;
-    my $time = time;
-
-    # XXX check if a newer one is available. (We currently read it
-    # from time to time)
-    for ($CPAN::Config->{index_expire}) {
-        $_ = 0.001 unless $_ && $_ > 0.001;
-    }
-    unless (1 || $CPAN::Have_warned->{readmetadatacache}++) {
-        # debug here when CPAN doesn't seem to read the Metadata
-        require Carp;
-        Carp::cluck("META-PROTOCOL[$CPAN::META->{PROTOCOL}]");
-    }
-    unless ($CPAN::META->{PROTOCOL}) {
-        $self->read_metadata_cache;
-        $CPAN::META->{PROTOCOL} ||= "1.0";
-    }
-    if ( $CPAN::META->{PROTOCOL} < PROTOCOL  ) {
-        # warn "Setting last_time to 0";
-        $LAST_TIME = 0; # No warning necessary
-    }
-    if ($LAST_TIME + $CPAN::Config->{index_expire}*86400 > $time
-        and ! $force) {
-        # called too often
-        # CPAN->debug("LAST_TIME[$LAST_TIME]index_expire[$CPAN::Config->{index_expire}]time[$time]");
-    } elsif (0) {
-        # IFF we are developing, it helps to wipe out the memory
-        # between reloads, otherwise it is not what a user expects.
-        undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274)
-        $CPAN::META = CPAN->new;
-    } else {
-        my($debug,$t2);
-        local $LAST_TIME = $time;
-        local $CPAN::META->{PROTOCOL} = PROTOCOL;
-
-        my $needshort = $^O eq "dos";
-
-        $self->rd_authindex($self
-                          ->reload_x(
-                                     "authors/01mailrc.txt.gz",
-                                     $needshort ?
-                                     File::Spec->catfile('authors', '01mailrc.gz') :
-                                     File::Spec->catfile('authors', '01mailrc.txt.gz'),
-                                     $force));
-        $t2 = time;
-        $debug = "timing reading 01[".($t2 - $time)."]";
-        $time = $t2;
-        return if $CPAN::Signal; # this is sometimes lengthy
-        $self->rd_modpacks($self
-                         ->reload_x(
-                                    "modules/02packages.details.txt.gz",
-                                    $needshort ?
-                                    File::Spec->catfile('modules', '02packag.gz') :
-                                    File::Spec->catfile('modules', '02packages.details.txt.gz'),
-                                    $force));
-        $t2 = time;
-        $debug .= "02[".($t2 - $time)."]";
-        $time = $t2;
-        return if $CPAN::Signal; # this is sometimes lengthy
-        $self->rd_modlist($self
-                        ->reload_x(
-                                   "modules/03modlist.data.gz",
-                                   $needshort ?
-                                   File::Spec->catfile('modules', '03mlist.gz') :
-                                   File::Spec->catfile('modules', '03modlist.data.gz'),
-                                   $force));
-        $self->write_metadata_cache;
-        $t2 = time;
-        $debug .= "03[".($t2 - $time)."]";
-        $time = $t2;
-        CPAN->debug($debug) if $CPAN::DEBUG;
-    }
-    if ($CPAN::Config->{build_dir_reuse}) {
-        $self->reanimate_build_dir;
-    }
-    if (CPAN::_sqlite_running) {
-        $CPAN::SQLite->reload(time => $time, force => $force)
-            if not $LAST_TIME;
-    }
-    $LAST_TIME = $time;
-    $CPAN::META->{PROTOCOL} = PROTOCOL;
-}
-
-#-> sub CPAN::Index::reanimate_build_dir ;
-sub reanimate_build_dir {
-    my($self) = @_;
-    unless ($CPAN::META->has_inst($CPAN::Config->{yaml_module}||"YAML")) {
-        return;
-    }
-    return if $HAVE_REANIMATED++;
-    my $d = $CPAN::Config->{build_dir};
-    my $dh = DirHandle->new;
-    opendir $dh, $d or return; # does not exist
-    my $dirent;
-    my $i = 0;
-    my $painted = 0;
-    my $restored = 0;
-    my @candidates = map { $_->[0] }
-        sort { $b->[1] <=> $a->[1] }
-            map { [ $_, -M File::Spec->catfile($d,$_) ] }
-                grep {/\.yml$/} readdir $dh;
-    unless (@candidates) {
-        $CPAN::Frontend->myprint("Build_dir empty, nothing to restore\n");
-        return;
-    }
-    $CPAN::Frontend->myprint
-        (sprintf("Going to read %d yaml file%s from %s/\n",
-                 scalar @candidates,
-                 @candidates==1 ? "" : "s",
-                 $CPAN::Config->{build_dir}
-                ));
-    my $start = CPAN::FTP::_mytime;
-  DISTRO: for $i (0..$#candidates) {
-        my $dirent = $candidates[$i];
-        my $y = eval {CPAN->_yaml_loadfile(File::Spec->catfile($d,$dirent))};
-        if ($@) {
-            warn "Error while parsing file '$dirent'; error: '$@'";
-            next DISTRO;
-        }
-        my $c = $y->[0];
-        if ($c && CPAN->_perl_fingerprint($c->{perl})) {
-            my $key = $c->{distribution}{ID};
-            for my $k (keys %{$c->{distribution}}) {
-                if ($c->{distribution}{$k}
-                    && ref $c->{distribution}{$k}
-                    && UNIVERSAL::isa($c->{distribution}{$k},"CPAN::Distrostatus")) {
-                    $c->{distribution}{$k}{COMMANDID} = $i - @candidates;
-                }
-            }
-
-            #we tried to restore only if element already
-            #exists; but then we do not work with metadata
-            #turned off.
-            my $do
-                = $CPAN::META->{readwrite}{'CPAN::Distribution'}{$key}
-                    = $c->{distribution};
-            for my $skipper (qw(
-                                badtestcnt
-                                configure_requires_later
-                                configure_requires_later_for
-                                force_update
-                                later
-                                later_for
-                                notest
-                                should_report
-                                sponsored_mods
-                                prefs
-                                negative_prefs_cache
-                               )) {
-                delete $do->{$skipper};
-            }
-            if ($do->tested_ok_but_not_installed) {
-                $CPAN::META->is_tested($do->{build_dir},$do->{make_test}{TIME});
-            }
-            $restored++;
-        }
-        $i++;
-        while (($painted/76) < ($i/@candidates)) {
-            $CPAN::Frontend->myprint(".");
-            $painted++;
-        }
-    }
-    my $took = CPAN::FTP::_mytime - $start;
-    $CPAN::Frontend->myprint(sprintf(
-                                     "DONE\nRestored the state of %s (in %.4f secs)\n",
-                                     $restored || "none",
-                                     $took,
-                                    ));
-}
-
-
-#-> sub CPAN::Index::reload_x ;
-sub reload_x {
-    my($cl,$wanted,$localname,$force) = @_;
-    $force |= 2; # means we're dealing with an index here
-    CPAN::HandleConfig->load; # we should guarantee loading wherever
-                              # we rely on Config XXX
-    $localname ||= $wanted;
-    my $abs_wanted = File::Spec->catfile($CPAN::Config->{'keep_source_where'},
-                                         $localname);
-    if (
-        -f $abs_wanted &&
-        -M $abs_wanted < $CPAN::Config->{'index_expire'} &&
-        !($force & 1)
-       ) {
-        my $s = $CPAN::Config->{'index_expire'} == 1 ? "" : "s";
-        $cl->debug(qq{$abs_wanted younger than $CPAN::Config->{'index_expire'} }.
-                   qq{day$s. I\'ll use that.});
-        return $abs_wanted;
-    } else {
-        $force |= 1; # means we're quite serious about it.
-    }
-    return CPAN::FTP->localize($wanted,$abs_wanted,$force);
-}
-
-#-> sub CPAN::Index::rd_authindex ;
-sub rd_authindex {
-    my($cl, $index_target) = @_;
-    return unless defined $index_target;
-    return if CPAN::_sqlite_running;
-    my @lines;
-    $CPAN::Frontend->myprint("Going to read $index_target\n");
-    local(*FH);
-    tie *FH, 'CPAN::Tarzip', $index_target;
-    local($/) = "\n";
-    local($_);
-    push @lines, split /\012/ while <FH>;
-    my $i = 0;
-    my $painted = 0;
-    foreach (@lines) {
-        my($userid,$fullname,$email) =
-            m/alias\s+(\S+)\s+\"([^\"\<]*)\s+\<(.*)\>\"/;
-        $fullname ||= $email;
-        if ($userid && $fullname && $email) {
-            my $userobj = $CPAN::META->instance('CPAN::Author',$userid);
-            $userobj->set('FULLNAME' => $fullname, 'EMAIL' => $email);
-        } else {
-            CPAN->debug(sprintf "line[%s]", $_) if $CPAN::DEBUG;
-        }
-        $i++;
-        while (($painted/76) < ($i/@lines)) {
-            $CPAN::Frontend->myprint(".");
-            $painted++;
-        }
-        return if $CPAN::Signal;
-    }
-    $CPAN::Frontend->myprint("DONE\n");
-}
-
-sub userid {
-  my($self,$dist) = @_;
-  $dist = $self->{'id'} unless defined $dist;
-  my($ret) = $dist =~ m|(?:\w/\w\w/)?([^/]+)/|;
-  $ret;
-}
-
-#-> sub CPAN::Index::rd_modpacks ;
-sub rd_modpacks {
-    my($self, $index_target) = @_;
-    return unless defined $index_target;
-    return if CPAN::_sqlite_running;
-    $CPAN::Frontend->myprint("Going to read $index_target\n");
-    my $fh = CPAN::Tarzip->TIEHANDLE($index_target);
-    local $_;
-    CPAN->debug(sprintf "start[%d]", time) if $CPAN::DEBUG;
-    my $slurp = "";
-    my $chunk;
-    while (my $bytes = $fh->READ(\$chunk,8192)) {
-        $slurp.=$chunk;
-    }
-    my @lines = split /\012/, $slurp;
-    CPAN->debug(sprintf "end[%d]", time) if $CPAN::DEBUG;
-    undef $fh;
-    # read header
-    my($line_count,$last_updated);
-    while (@lines) {
-        my $shift = shift(@lines);
-        last if $shift =~ /^\s*$/;
-        $shift =~ /^Line-Count:\s+(\d+)/ and $line_count = $1;
-        $shift =~ /^Last-Updated:\s+(.+)/ and $last_updated = $1;
-    }
-    CPAN->debug("line_count[$line_count]last_updated[$last_updated]") if $CPAN::DEBUG;
-    if (not defined $line_count) {
-
-        $CPAN::Frontend->mywarn(qq{Warning: Your $index_target does not contain a Line-Count header.
-Please check the validity of the index file by comparing it to more
-than one CPAN mirror. I'll continue but problems seem likely to
-happen.\a
-});
-
-        $CPAN::Frontend->mysleep(5);
-    } elsif ($line_count != scalar @lines) {
-
-        $CPAN::Frontend->mywarn(sprintf qq{Warning: Your %s
-contains a Line-Count header of %d but I see %d lines there. Please
-check the validity of the index file by comparing it to more than one
-CPAN mirror. I'll continue but problems seem likely to happen.\a\n},
-$index_target, $line_count, scalar(@lines));
-
-    }
-    if (not defined $last_updated) {
-
-        $CPAN::Frontend->mywarn(qq{Warning: Your $index_target does not contain a Last-Updated header.
-Please check the validity of the index file by comparing it to more
-than one CPAN mirror. I'll continue but problems seem likely to
-happen.\a
-});
-
-        $CPAN::Frontend->mysleep(5);
-    } else {
-
-        $CPAN::Frontend
-            ->myprint(sprintf qq{  Database was generated on %s\n},
-                      $last_updated);
-        $DATE_OF_02 = $last_updated;
-
-        my $age = time;
-        if ($CPAN::META->has_inst('HTTP::Date')) {
-            require HTTP::Date;
-            $age -= HTTP::Date::str2time($last_updated);
-        } else {
-            $CPAN::Frontend->mywarn("  HTTP::Date not available\n");
-            require Time::Local;
-            my(@d) = $last_updated =~ / (\d+) (\w+) (\d+) (\d+):(\d+):(\d+) /;
-            $d[1] = index("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", $d[1])/4;
-            $age -= $d[1]>=0 ? Time::Local::timegm(@d[5,4,3,0,1,2]) : 0;
-        }
-        $age /= 3600*24;
-        if ($age > 30) {
-
-            $CPAN::Frontend
-                ->mywarn(sprintf
-                         qq{Warning: This index file is %d days old.
-  Please check the host you chose as your CPAN mirror for staleness.
-  I'll continue but problems seem likely to happen.\a\n},
-                         $age);
-
-        } elsif ($age < -1) {
-
-            $CPAN::Frontend
-                ->mywarn(sprintf
-                         qq{Warning: Your system date is %d days behind this index file!
-  System time:          %s
-  Timestamp index file: %s
-  Please fix your system time, problems with the make command expected.\n},
-                         -$age,
-                         scalar gmtime,
-                         $DATE_OF_02,
-                        );
-
-        }
-    }
-
-
-    # A necessity since we have metadata_cache: delete what isn't
-    # there anymore
-    my $secondtime = $CPAN::META->exists("CPAN::Module","CPAN");
-    CPAN->debug("secondtime[$secondtime]") if $CPAN::DEBUG;
-    my(%exists);
-    my $i = 0;
-    my $painted = 0;
-    foreach (@lines) {
-        # before 1.56 we split into 3 and discarded the rest. From
-        # 1.57 we assign remaining text to $comment thus allowing to
-        # influence isa_perl
-        my($mod,$version,$dist,$comment) = split " ", $_, 4;
-        unless ($mod && defined $version && $dist) {
-            $CPAN::Frontend->mywarn("Could not split line[$_]\n");
-            next;
-        }
-        my($bundle,$id,$userid);
-
-        if ($mod eq 'CPAN' &&
-            ! (
-            CPAN::Queue->exists('Bundle::CPAN') ||
-            CPAN::Queue->exists('CPAN')
-            )
-        ) {
-            local($^W)= 0;
-            if ($version > $CPAN::VERSION) {
-                $CPAN::Frontend->mywarn(qq{
-  New CPAN.pm version (v$version) available.
-  [Currently running version is v$CPAN::VERSION]
-  You might want to try
-    install CPAN
-    reload cpan
-  to both upgrade CPAN.pm and run the new version without leaving
-  the current session.
-
-}); #});
-                $CPAN::Frontend->mysleep(2);
-                $CPAN::Frontend->myprint(qq{\n});
-            }
-            last if $CPAN::Signal;
-        } elsif ($mod =~ /^Bundle::(.*)/) {
-            $bundle = $1;
-        }
-
-        if ($bundle) {
-            $id =  $CPAN::META->instance('CPAN::Bundle',$mod);
-            # Let's make it a module too, because bundles have so much
-            # in common with modules.
-
-            # Changed in 1.57_63: seems like memory bloat now without
-            # any value, so commented out
-
-            # $CPAN::META->instance('CPAN::Module',$mod);
-
-        } else {
-
-            # instantiate a module object
-            $id = $CPAN::META->instance('CPAN::Module',$mod);
-
-        }
-
-        # Although CPAN prohibits same name with different version the
-        # indexer may have changed the version for the same distro
-        # since the last time ("Force Reindexing" feature)
-        if ($id->cpan_file ne $dist
-            ||
-            $id->cpan_version ne $version
-           ) {
-            $userid = $id->userid || $self->userid($dist);
-            $id->set(
-                     'CPAN_USERID' => $userid,
-                     'CPAN_VERSION' => $version,
-                     'CPAN_FILE' => $dist,
-                    );
-        }
-
-        # instantiate a distribution object
-        if ($CPAN::META->exists('CPAN::Distribution',$dist)) {
-        # we do not need CONTAINSMODS unless we do something with
-        # this dist, so we better produce it on demand.
-
-        ## my $obj = $CPAN::META->instance(
-        ##                                 'CPAN::Distribution' => $dist
-        ##                                );
-        ## $obj->{CONTAINSMODS}{$mod} = undef; # experimental
-        } else {
-            $CPAN::META->instance(
-                                  'CPAN::Distribution' => $dist
-                                 )->set(
-                                        'CPAN_USERID' => $userid,
-                                        'CPAN_COMMENT' => $comment,
-                                       );
-        }
-        if ($secondtime) {
-            for my $name ($mod,$dist) {
-                # $self->debug("exists name[$name]") if $CPAN::DEBUG;
-                $exists{$name} = undef;
-            }
-        }
-        $i++;
-        while (($painted/76) < ($i/@lines)) {
-            $CPAN::Frontend->myprint(".");
-            $painted++;
-        }
-        return if $CPAN::Signal;
-    }
-    $CPAN::Frontend->myprint("DONE\n");
-    if ($secondtime) {
-        for my $class (qw(CPAN::Module CPAN::Bundle CPAN::Distribution)) {
-            for my $o ($CPAN::META->all_objects($class)) {
-                next if exists $exists{$o->{ID}};
-                $CPAN::META->delete($class,$o->{ID});
-                # CPAN->debug("deleting ID[$o->{ID}] in class[$class]")
-                #     if $CPAN::DEBUG;
-            }
-        }
-    }
-}
-
-#-> sub CPAN::Index::rd_modlist ;
-sub rd_modlist {
-    my($cl,$index_target) = @_;
-    return unless defined $index_target;
-    return if CPAN::_sqlite_running;
-    $CPAN::Frontend->myprint("Going to read $index_target\n");
-    my $fh = CPAN::Tarzip->TIEHANDLE($index_target);
-    local $_;
-    my $slurp = "";
-    my $chunk;
-    while (my $bytes = $fh->READ(\$chunk,8192)) {
-        $slurp.=$chunk;
-    }
-    my @eval2 = split /\012/, $slurp;
-
-    while (@eval2) {
-        my $shift = shift(@eval2);
-        if ($shift =~ /^Date:\s+(.*)/) {
-            if ($DATE_OF_03 eq $1) {
-                $CPAN::Frontend->myprint("Unchanged.\n");
-                return;
-            }
-            ($DATE_OF_03) = $1;
-        }
-        last if $shift =~ /^\s*$/;
-    }
-    push @eval2, q{CPAN::Modulelist->data;};
-    local($^W) = 0;
-    my($compmt) = Safe->new("CPAN::Safe1");
-    my($eval2) = join("\n", @eval2);
-    CPAN->debug(sprintf "length of eval2[%d]", length $eval2) if $CPAN::DEBUG;
-    my $ret = $compmt->reval($eval2);
-    Carp::confess($@) if $@;
-    return if $CPAN::Signal;
-    my $i = 0;
-    my $until = keys(%$ret);
-    my $painted = 0;
-    CPAN->debug(sprintf "until[%d]", $until) if $CPAN::DEBUG;
-    for (keys %$ret) {
-        my $obj = $CPAN::META->instance("CPAN::Module",$_);
-        delete $ret->{$_}{modid}; # not needed here, maybe elsewhere
-        $obj->set(%{$ret->{$_}});
-        $i++;
-        while (($painted/76) < ($i/$until)) {
-            $CPAN::Frontend->myprint(".");
-            $painted++;
-        }
-        return if $CPAN::Signal;
-    }
-    $CPAN::Frontend->myprint("DONE\n");
-}
-
-#-> sub CPAN::Index::write_metadata_cache ;
-sub write_metadata_cache {
-    my($self) = @_;
-    return unless $CPAN::Config->{'cache_metadata'};
-    return if CPAN::_sqlite_running;
-    return unless $CPAN::META->has_usable("Storable");
-    my $cache;
-    foreach my $k (qw(CPAN::Bundle CPAN::Author CPAN::Module
-                      CPAN::Distribution)) {
-        $cache->{$k} = $CPAN::META->{readonly}{$k}; # unsafe meta access, ok
-    }
-    my $metadata_file = File::Spec->catfile($CPAN::Config->{cpan_home},"Metadata");
-    $cache->{last_time} = $LAST_TIME;
-    $cache->{DATE_OF_02} = $DATE_OF_02;
-    $cache->{PROTOCOL} = PROTOCOL;
-    $CPAN::Frontend->myprint("Going to write $metadata_file\n");
-    eval { Storable::nstore($cache, $metadata_file) };
-    $CPAN::Frontend->mywarn($@) if $@; # ?? missing "\n" after $@ in mywarn ??
-}
-
-#-> sub CPAN::Index::read_metadata_cache ;
-sub read_metadata_cache {
-    my($self) = @_;
-    return unless $CPAN::Config->{'cache_metadata'};
-    return if CPAN::_sqlite_running;
-    return unless $CPAN::META->has_usable("Storable");
-    my $metadata_file = File::Spec->catfile($CPAN::Config->{cpan_home},"Metadata");
-    return unless -r $metadata_file and -f $metadata_file;
-    $CPAN::Frontend->myprint("Going to read $metadata_file\n");
-    my $cache;
-    eval { $cache = Storable::retrieve($metadata_file) };
-    $CPAN::Frontend->mywarn($@) if $@; # ?? missing "\n" after $@ in mywarn ??
-    if (!$cache || !UNIVERSAL::isa($cache, 'HASH')) {
-        $LAST_TIME = 0;
-        return;
-    }
-    if (exists $cache->{PROTOCOL}) {
-        if (PROTOCOL > $cache->{PROTOCOL}) {
-            $CPAN::Frontend->mywarn(sprintf("Ignoring Metadata cache written ".
-                                            "with protocol v%s, requiring v%s\n",
-                                            $cache->{PROTOCOL},
-                                            PROTOCOL)
-                                   );
-            return;
-        }
-    } else {
-        $CPAN::Frontend->mywarn("Ignoring Metadata cache written ".
-                                "with protocol v1.0\n");
-        return;
-    }
-    my $clcnt = 0;
-    my $idcnt = 0;
-    while(my($class,$v) = each %$cache) {
-        next unless $class =~ /^CPAN::/;
-        $CPAN::META->{readonly}{$class} = $v; # unsafe meta access, ok
-        while (my($id,$ro) = each %$v) {
-            $CPAN::META->{readwrite}{$class}{$id} ||=
-                $class->new(ID=>$id, RO=>$ro);
-            $idcnt++;
-        }
-        $clcnt++;
-    }
-    unless ($clcnt) { # sanity check
-        $CPAN::Frontend->myprint("Warning: Found no data in $metadata_file\n");
-        return;
-    }
-    if ($idcnt < 1000) {
-        $CPAN::Frontend->myprint("Warning: Found only $idcnt objects ".
-                                 "in $metadata_file\n");
-        return;
-    }
-    $CPAN::META->{PROTOCOL} ||=
-        $cache->{PROTOCOL}; # reading does not up or downgrade, but it
-                            # does initialize to some protocol
-    $LAST_TIME = $cache->{last_time};
-    $DATE_OF_02 = $cache->{DATE_OF_02};
-    $CPAN::Frontend->myprint("  Database was generated on $DATE_OF_02\n")
-        if defined $DATE_OF_02; # An old cache may not contain DATE_OF_02
-    return;
-}
-
-package CPAN::InfoObj;
-use strict;
-use Cwd qw(chdir);
-
-sub ro {
-    my $self = shift;
-    exists $self->{RO} and return $self->{RO};
-}
-
-#-> sub CPAN::InfoObj::cpan_userid
-sub cpan_userid {
-    my $self = shift;
-    my $ro = $self->ro;
-    if ($ro) {
-        return $ro->{CPAN_USERID} || "N/A";
-    } else {
-        $self->debug("ID[$self->{ID}]");
-        # N/A for bundles found locally
-        return "N/A";
-    }
-}
-
-sub id { shift->{ID}; }
-
-#-> sub CPAN::InfoObj::new ;
-sub new {
-    my $this = bless {}, shift;
-    %$this = @_;
-    $this
-}
-
-# The set method may only be used by code that reads index data or
-# otherwise "objective" data from the outside world. All session
-# related material may do anything else with instance variables but
-# must not touch the hash under the RO attribute. The reason is that
-# the RO hash gets written to Metadata file and is thus persistent.
-
-#-> sub CPAN::InfoObj::safe_chdir ;
-sub safe_chdir {
-  my($self,$todir) = @_;
-  # we die if we cannot chdir and we are debuggable
-  Carp::confess("safe_chdir called without todir argument")
-        unless defined $todir and length $todir;
-  if (chdir $todir) {
-    $self->debug(sprintf "changed directory to %s", CPAN::anycwd())
-        if $CPAN::DEBUG;
-  } else {
-    if (-e $todir) {
-        unless (-x $todir) {
-            unless (chmod 0755, $todir) {
-                my $cwd = CPAN::anycwd();
-                $CPAN::Frontend->mywarn("I have neither the -x permission nor the ".
-                                        "permission to change the permission; cannot ".
-                                        "chdir to '$todir'\n");
-                $CPAN::Frontend->mysleep(5);
-                $CPAN::Frontend->mydie(qq{Could not chdir from cwd[$cwd] }.
-                                       qq{to todir[$todir]: $!});
-            }
-        }
-    } else {
-        $CPAN::Frontend->mydie("Directory '$todir' has gone. Cannot continue.\n");
-    }
-    if (chdir $todir) {
-      $self->debug(sprintf "changed directory to %s", CPAN::anycwd())
-          if $CPAN::DEBUG;
-    } else {
-      my $cwd = CPAN::anycwd();
-      $CPAN::Frontend->mydie(qq{Could not chdir from cwd[$cwd] }.
-                             qq{to todir[$todir] (a chmod has been issued): $!});
-    }
-  }
-}
-
-#-> sub CPAN::InfoObj::set ;
-sub set {
-    my($self,%att) = @_;
-    my $class = ref $self;
-
-    # This must be ||=, not ||, because only if we write an empty
-    # reference, only then the set method will write into the readonly
-    # area. But for Distributions that spring into existence, maybe
-    # because of a typo, we do not like it that they are written into
-    # the readonly area and made permanent (at least for a while) and
-    # that is why we do not "allow" other places to call ->set.
-    unless ($self->id) {
-        CPAN->debug("Bug? Empty ID, rejecting");
-        return;
-    }
-    my $ro = $self->{RO} =
-        $CPAN::META->{readonly}{$class}{$self->id} ||= {};
-
-    while (my($k,$v) = each %att) {
-        $ro->{$k} = $v;
-    }
-}
-
-#-> sub CPAN::InfoObj::as_glimpse ;
-sub as_glimpse {
-    my($self) = @_;
-    my(@m);
-    my $class = ref($self);
-    $class =~ s/^CPAN:://;
-    my $id = $self->can("pretty_id") ? $self->pretty_id : $self->{ID};
-    push @m, sprintf "%-15s %s\n", $class, $id;
-    join "", @m;
-}
-
-#-> sub CPAN::InfoObj::as_string ;
-sub as_string {
-    my($self) = @_;
-    my(@m);
-    my $class = ref($self);
-    $class =~ s/^CPAN:://;
-    push @m, $class, " id = $self->{ID}\n";
-    my $ro;
-    unless ($ro = $self->ro) {
-        if (substr($self->{ID},-1,1) eq ".") { # directory
-            $ro = +{};
-        } else {
-            $CPAN::Frontend->mywarn("Unknown object $self->{ID}\n");
-            $CPAN::Frontend->mysleep(5);
-            return;
-        }
-    }
-    for (sort keys %$ro) {
-        # next if m/^(ID|RO)$/;
-        my $extra = "";
-        if ($_ eq "CPAN_USERID") {
-            $extra .= " (";
-            $extra .= $self->fullname;
-            my $email; # old perls!
-            if ($email = $CPAN::META->instance("CPAN::Author",
-                                               $self->cpan_userid
-                                              )->email) {
-                $extra .= " <$email>";
-            } else {
-                $extra .= " <no email>";
-            }
-            $extra .= ")";
-        } elsif ($_ eq "FULLNAME") { # potential UTF-8 conversion
-            push @m, sprintf "    %-12s %s\n", $_, $self->fullname;
-            next;
-        }
-        next unless defined $ro->{$_};
-        push @m, sprintf "    %-12s %s%s\n", $_, $ro->{$_}, $extra;
-    }
-  KEY: for (sort keys %$self) {
-        next if m/^(ID|RO)$/;
-        unless (defined $self->{$_}) {
-            delete $self->{$_};
-            next KEY;
-        }
-        if (ref($self->{$_}) eq "ARRAY") {
-            push @m, sprintf "    %-12s %s\n", $_, "@{$self->{$_}}";
-        } elsif (ref($self->{$_}) eq "HASH") {
-            my $value;
-            if (/^CONTAINSMODS$/) {
-                $value = join(" ",sort keys %{$self->{$_}});
-            } elsif (/^prereq_pm$/) {
-                my @value;
-                my $v = $self->{$_};
-                for my $x (sort keys %$v) {
-                    my @svalue;
-                    for my $y (sort keys %{$v->{$x}}) {
-                        push @svalue, "$y=>$v->{$x}{$y}";
-                    }
-                    push @value, "$x\:" . join ",", @svalue if @svalue;
-                }
-                $value = join ";", @value;
-            } else {
-                $value = $self->{$_};
-            }
-            push @m, sprintf(
-                             "    %-12s %s\n",
-                             $_,
-                             $value,
-                            );
-        } else {
-            push @m, sprintf "    %-12s %s\n", $_, $self->{$_};
-        }
-    }
-    join "", @m, "\n";
-}
-
-#-> sub CPAN::InfoObj::fullname ;
-sub fullname {
-    my($self) = @_;
-    $CPAN::META->instance("CPAN::Author",$self->cpan_userid)->fullname;
-}
-
-#-> sub CPAN::InfoObj::dump ;
-sub dump {
-    my($self, $what) = @_;
-    unless ($CPAN::META->has_inst("Data::Dumper")) {
-        $CPAN::Frontend->mydie("dump command requires Data::Dumper installed");
-    }
-    local $Data::Dumper::Sortkeys;
-    $Data::Dumper::Sortkeys = 1;
-    my $out = Data::Dumper::Dumper($what ? eval $what : $self);
-    if (length $out > 100000) {
-        my $fh_pager = FileHandle->new;
-        local($SIG{PIPE}) = "IGNORE";
-        my $pager = $CPAN::Config->{'pager'} || "cat";
-        $fh_pager->open("|$pager")
-            or die "Could not open pager $pager\: $!";
-        $fh_pager->print($out);
-        close $fh_pager;
-    } else {
-        $CPAN::Frontend->myprint($out);
-    }
-}
-
-package CPAN::Author;
-use strict;
-
-#-> sub CPAN::Author::force
-sub force {
-    my $self = shift;
-    $self->{force}++;
-}
-
-#-> sub CPAN::Author::force
-sub unforce {
-    my $self = shift;
-    delete $self->{force};
-}
-
-#-> sub CPAN::Author::id
-sub id {
-    my $self = shift;
-    my $id = $self->{ID};
-    $CPAN::Frontend->mydie("Illegal author id[$id]") unless $id =~ /^[A-Z]/;
-    $id;
-}
-
-#-> sub CPAN::Author::as_glimpse ;
-sub as_glimpse {
-    my($self) = @_;
-    my(@m);
-    my $class = ref($self);
-    $class =~ s/^CPAN:://;
-    push @m, sprintf(qq{%-15s %s ("%s" <%s>)\n},
-                     $class,
-                     $self->{ID},
-                     $self->fullname,
-                     $self->email);
-    join "", @m;
-}
-
-#-> sub CPAN::Author::fullname ;
-sub fullname {
-    shift->ro->{FULLNAME};
-}
-*name = \&fullname;
-
-#-> sub CPAN::Author::email ;
-sub email    { shift->ro->{EMAIL}; }
-
-#-> sub CPAN::Author::ls ;
-sub ls {
-    my $self = shift;
-    my $glob = shift || "";
-    my $silent = shift || 0;
-    my $id = $self->id;
-
-    # adapted from CPAN::Distribution::verifyCHECKSUM ;
-    my(@csf); # chksumfile
-    @csf = $self->id =~ /(.)(.)(.*)/;
-    $csf[1] = join "", @csf[0,1];
-    $csf[2] = join "", @csf[1,2]; # ("A","AN","ANDK")
-    my(@dl);
-    @dl = $self->dir_listing([$csf[0],"CHECKSUMS"], 0, 1);
-    unless (grep {$_->[2] eq $csf[1]} @dl) {
-        $CPAN::Frontend->myprint("Directory $csf[1]/ does not exist\n") unless $silent ;
-        return;
-    }
-    @dl = $self->dir_listing([@csf[0,1],"CHECKSUMS"], 0, 1);
-    unless (grep {$_->[2] eq $csf[2]} @dl) {
-        $CPAN::Frontend->myprint("Directory $id/ does not exist\n") unless $silent;
-        return;
-    }
-    @dl = $self->dir_listing([@csf,"CHECKSUMS"], 1, 1);
-    if ($glob) {
-        if ($CPAN::META->has_inst("Text::Glob")) {
-            my $rglob = Text::Glob::glob_to_regex($glob);
-            @dl = grep { $_->[2] =~ /$rglob/ } @dl;
-        } else {
-            $CPAN::Frontend->mydie("Text::Glob not installed, cannot proceed");
-        }
-    }
-    unless ($silent >= 2) {
-        $CPAN::Frontend->myprint(join "", map {
-            sprintf("%8d %10s %s/%s\n", $_->[0], $_->[1], $id, $_->[2])
-        } sort { $a->[2] cmp $b->[2] } @dl);
-    }
-    @dl;
-}
-
-# returns an array of arrays, the latter contain (size,mtime,filename)
-#-> sub CPAN::Author::dir_listing ;
-sub dir_listing {
-    my $self = shift;
-    my $chksumfile = shift;
-    my $recursive = shift;
-    my $may_ftp = shift;
-
-    my $lc_want =
-        File::Spec->catfile($CPAN::Config->{keep_source_where},
-                            "authors", "id", @$chksumfile);
-
-    my $fh;
-
-    # Purge and refetch old (pre-PGP) CHECKSUMS; they are a security
-    # hazard.  (Without GPG installed they are not that much better,
-    # though.)
-    $fh = FileHandle->new;
-    if (open($fh, $lc_want)) {
-        my $line = <$fh>; close $fh;
-        unlink($lc_want) unless $line =~ /PGP/;
-    }
-
-    local($") = "/";
-    # connect "force" argument with "index_expire".
-    my $force = $self->{force};
-    if (my @stat = stat $lc_want) {
-        $force ||= $stat[9] + $CPAN::Config->{index_expire}*86400 <= time;
-    }
-    my $lc_file;
-    if ($may_ftp) {
-        $lc_file = CPAN::FTP->localize(
-                                       "authors/id/@$chksumfile",
-                                       $lc_want,
-                                       $force,
-                                      );
-        unless ($lc_file) {
-            $CPAN::Frontend->myprint("Trying $lc_want.gz\n");
-            $chksumfile->[-1] .= ".gz";
-            $lc_file = CPAN::FTP->localize("authors/id/@$chksumfile",
-                                           "$lc_want.gz",1);
-            if ($lc_file) {
-                $lc_file =~ s{\.gz(?!\n)\Z}{}; #};
-                eval{CPAN::Tarzip->new("$lc_file.gz")->gunzip($lc_file)};
-            } else {
-                return;
-            }
-        }
-    } else {
-        $lc_file = $lc_want;
-        # we *could* second-guess and if the user has a file: URL,
-        # then we could look there. But on the other hand, if they do
-        # have a file: URL, wy did they choose to set
-        # $CPAN::Config->{show_upload_date} to false?
-    }
-
-    # adapted from CPAN::Distribution::CHECKSUM_check_file ;
-    $fh = FileHandle->new;
-    my($cksum);
-    if (open $fh, $lc_file) {
-        local($/);
-        my $eval = <$fh>;
-        $eval =~ s/\015?\012/\n/g;
-        close $fh;
-        my($compmt) = Safe->new();
-        $cksum = $compmt->reval($eval);
-        if ($@) {
-            rename $lc_file, "$lc_file.bad";
-            Carp::confess($@) if $@;
-        }
-    } elsif ($may_ftp) {
-        Carp::carp "Could not open '$lc_file' for reading.";
-    } else {
-        # Maybe should warn: "You may want to set show_upload_date to a true value"
-        return;
-    }
-    my(@result,$f);
-    for $f (sort keys %$cksum) {
-        if (exists $cksum->{$f}{isdir}) {
-            if ($recursive) {
-                my(@dir) = @$chksumfile;
-                pop @dir;
-                push @dir, $f, "CHECKSUMS";
-                push @result, map {
-                    [$_->[0], $_->[1], "$f/$_->[2]"]
-                } $self->dir_listing(\@dir,1,$may_ftp);
-            } else {
-                push @result, [ 0, "-", $f ];
-            }
-        } else {
-            push @result, [
-                           ($cksum->{$f}{"size"}||0),
-                           $cksum->{$f}{"mtime"}||"---",
-                           $f
-                          ];
-        }
-    }
-    @result;
-}
-
-#-> sub CPAN::Author::reports
-sub reports {
-    $CPAN::Frontend->mywarn("reports on authors not implemented.
-Please file a bugreport if you need this.\n");
-}
-
-package CPAN::Distribution;
-use strict;
-use Cwd qw(chdir);
-use CPAN::Distroprefs;
-
-# Accessors
-sub cpan_comment {
-    my $self = shift;
-    my $ro = $self->ro or return;
-    $ro->{CPAN_COMMENT}
-}
-
-#-> CPAN::Distribution::undelay
-sub undelay {
-    my $self = shift;
-    for my $delayer (
-                     "configure_requires_later",
-                     "configure_requires_later_for",
-                     "later",
-                     "later_for",
-                    ) {
-        delete $self->{$delayer};
-    }
-}
-
-#-> CPAN::Distribution::is_dot_dist
-sub is_dot_dist {
-    my($self) = @_;
-    return substr($self->id,-1,1) eq ".";
-}
-
-# add the A/AN/ stuff
-#-> CPAN::Distribution::normalize
-sub normalize {
-    my($self,$s) = @_;
-    $s = $self->id unless defined $s;
-    if (substr($s,-1,1) eq ".") {
-        # using a global because we are sometimes called as static method
-        if (!$CPAN::META->{LOCK}
-            && !$CPAN::Have_warned->{"$s is unlocked"}++
-           ) {
-            $CPAN::Frontend->mywarn("You are visiting the local directory
-  '$s'
-  without lock, take care that concurrent processes do not do likewise.\n");
-            $CPAN::Frontend->mysleep(1);
-        }
-        if ($s eq ".") {
-            $s = "$CPAN::iCwd/.";
-        } elsif (File::Spec->file_name_is_absolute($s)) {
-        } elsif (File::Spec->can("rel2abs")) {
-            $s = File::Spec->rel2abs($s);
-        } else {
-            $CPAN::Frontend->mydie("Your File::Spec is too old, please upgrade File::Spec");
-        }
-        CPAN->debug("s[$s]") if $CPAN::DEBUG;
-        unless ($CPAN::META->exists("CPAN::Distribution", $s)) {
-            for ($CPAN::META->instance("CPAN::Distribution", $s)) {
-                $_->{build_dir} = $s;
-                $_->{archived} = "local_directory";
-                $_->{unwrapped} = CPAN::Distrostatus->new("YES -- local_directory");
-            }
-        }
-    } elsif (
-        $s =~ tr|/|| == 1
-        or
-        $s !~ m|[A-Z]/[A-Z-]{2}/[A-Z-]{2,}/|
-       ) {
-        return $s if $s =~ m:^N/A|^Contact Author: ;
-        $s =~ s|^(.)(.)([^/]*/)(.+)$|$1/$1$2/$1$2$3$4|;
-        CPAN->debug("s[$s]") if $CPAN::DEBUG;
-    }
-    $s;
-}
-
-#-> sub CPAN::Distribution::author ;
-sub author {
-    my($self) = @_;
-    my($authorid);
-    if (substr($self->id,-1,1) eq ".") {
-        $authorid = "LOCAL";
-    } else {
-        ($authorid) = $self->pretty_id =~ /^([\w\-]+)/;
-    }
-    CPAN::Shell->expand("Author",$authorid);
-}
-
-# tries to get the yaml from CPAN instead of the distro itself:
-# EXPERIMENTAL, UNDOCUMENTED AND UNTESTED, for Tels
-sub fast_yaml {
-    my($self) = @_;
-    my $meta = $self->pretty_id;
-    $meta =~ s/\.(tar.gz|tgz|zip|tar.bz2)/.meta/;
-    my(@ls) = CPAN::Shell->globls($meta);
-    my $norm = $self->normalize($meta);
-
-    my($local_file);
-    my($local_wanted) =
-        File::Spec->catfile(
-                            $CPAN::Config->{keep_source_where},
-                            "authors",
-                            "id",
-                            split(/\//,$norm)
-                           );
-    $self->debug("Doing localize") if $CPAN::DEBUG;
-    unless ($local_file =
-            CPAN::FTP->localize("authors/id/$norm",
-                                $local_wanted)) {
-        $CPAN::Frontend->mydie("Giving up on downloading yaml file '$local_wanted'\n");
-    }
-    my $yaml = CPAN->_yaml_loadfile($local_file)->[0];
-}
-
-#-> sub CPAN::Distribution::cpan_userid
-sub cpan_userid {
-    my $self = shift;
-    if ($self->{ID} =~ m{[A-Z]/[A-Z\-]{2}/([A-Z\-]+)/}) {
-        return $1;
-    }
-    return $self->SUPER::cpan_userid;
-}
-
-#-> sub CPAN::Distribution::pretty_id
-sub pretty_id {
-    my $self = shift;
-    my $id = $self->id;
-    return $id unless $id =~ m|^./../|;
-    substr($id,5);
-}
-
-#-> sub CPAN::Distribution::base_id
-sub base_id {
-    my $self = shift;
-    my $id = $self->pretty_id();
-    my $base_id = File::Basename::basename($id);
-    $base_id =~ s{\.(?:tar\.(bz2|gz|Z)|t(?:gz|bz)|zip)$}{}i;
-    return $base_id;
-}
-
-#-> sub CPAN::Distribution::tested_ok_but_not_installed
-sub tested_ok_but_not_installed {
-    my $self = shift;
-    return (
-           $self->{make_test}
-        && $self->{build_dir}
-        && (UNIVERSAL::can($self->{make_test},"failed") ?
-             ! $self->{make_test}->failed :
-             $self->{make_test} =~ /^YES/
-            )
-        && (
-            !$self->{install}
-            ||
-            $self->{install}->failed
-           )
-    ); 
-}
-
-
-# mark as dirty/clean for the sake of recursion detection. $color=1
-# means "in use", $color=0 means "not in use anymore". $color=2 means
-# we have determined prereqs now and thus insist on passing this
-# through (at least) once again.
-
-#-> sub CPAN::Distribution::color_cmd_tmps ;
-sub color_cmd_tmps {
-    my($self) = shift;
-    my($depth) = shift || 0;
-    my($color) = shift || 0;
-    my($ancestors) = shift || [];
-    # a distribution needs to recurse into its prereq_pms
-
-    return if exists $self->{incommandcolor}
-        && $color==1
-        && $self->{incommandcolor}==$color;
-    if ($depth>=$CPAN::MAX_RECURSION) {
-        die(CPAN::Exception::RecursiveDependency->new($ancestors));
-    }
-    # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1;
-    my $prereq_pm = $self->prereq_pm;
-    if (defined $prereq_pm) {
-      PREREQ: for my $pre (keys %{$prereq_pm->{requires}||{}},
-                           keys %{$prereq_pm->{build_requires}||{}}) {
-            next PREREQ if $pre eq "perl";
-            my $premo;
-            unless ($premo = CPAN::Shell->expand("Module",$pre)) {
-                $CPAN::Frontend->mywarn("prerequisite module[$pre] not known\n");
-                $CPAN::Frontend->mysleep(2);
-                next PREREQ;
-            }
-            $premo->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]);
-        }
-    }
-    if ($color==0) {
-        delete $self->{sponsored_mods};
-
-        # as we are at the end of a command, we'll give up this
-        # reminder of a broken test. Other commands may test this guy
-        # again. Maybe 'badtestcnt' should be renamed to
-        # 'make_test_failed_within_command'?
-        delete $self->{badtestcnt};
-    }
-    $self->{incommandcolor} = $color;
-}
-
-#-> sub CPAN::Distribution::as_string ;
-sub as_string {
-    my $self = shift;
-    $self->containsmods;
-    $self->upload_date;
-    $self->SUPER::as_string(@_);
-}
-
-#-> sub CPAN::Distribution::containsmods ;
-sub containsmods {
-    my $self = shift;
-    return keys %{$self->{CONTAINSMODS}} if exists $self->{CONTAINSMODS};
-    my $dist_id = $self->{ID};
-    for my $mod ($CPAN::META->all_objects("CPAN::Module")) {
-        my $mod_file = $mod->cpan_file or next;
-        my $mod_id = $mod->{ID} or next;
-        # warn "mod_file[$mod_file] dist_id[$dist_id] mod_id[$mod_id]";
-        # sleep 1;
-        if ($CPAN::Signal) {
-            delete $self->{CONTAINSMODS};
-            return;
-        }
-        $self->{CONTAINSMODS}{$mod_id} = undef if $mod_file eq $dist_id;
-    }
-    keys %{$self->{CONTAINSMODS}||={}};
-}
-
-#-> sub CPAN::Distribution::upload_date ;
-sub upload_date {
-    my $self = shift;
-    return $self->{UPLOAD_DATE} if exists $self->{UPLOAD_DATE};
-    my(@local_wanted) = split(/\//,$self->id);
-    my $filename = pop @local_wanted;
-    push @local_wanted, "CHECKSUMS";
-    my $author = CPAN::Shell->expand("Author",$self->cpan_userid);
-    return unless $author;
-    my @dl = $author->dir_listing(\@local_wanted,0,$CPAN::Config->{show_upload_date});
-    return unless @dl;
-    my($dirent) = grep { $_->[2] eq $filename } @dl;
-    # warn sprintf "dirent[%s]id[%s]", $dirent, $self->id;
-    return unless $dirent->[1];
-    return $self->{UPLOAD_DATE} = $dirent->[1];
-}
-
-#-> sub CPAN::Distribution::uptodate ;
-sub uptodate {
-    my($self) = @_;
-    my $c;
-    foreach $c ($self->containsmods) {
-        my $obj = CPAN::Shell->expandany($c);
-        unless ($obj->uptodate) {
-            my $id = $self->pretty_id;
-            $self->debug("$id not uptodate due to $c") if $CPAN::DEBUG;
-            return 0;
-        }
-    }
-    return 1;
-}
-
-#-> sub CPAN::Distribution::called_for ;
-sub called_for {
-    my($self,$id) = @_;
-    $self->{CALLED_FOR} = $id if defined $id;
-    return $self->{CALLED_FOR};
-}
-
-#-> sub CPAN::Distribution::get ;
-sub get {
-    my($self) = @_;
-    $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG;
-    if (my $goto = $self->prefs->{goto}) {
-        $CPAN::Frontend->mywarn
-            (sprintf(
-                     "delegating to '%s' as specified in prefs file '%s' doc %d\n",
-                     $goto,
-                     $self->{prefs_file},
-                     $self->{prefs_file_doc},
-                    ));
-        return $self->goto($goto);
-    }
-    local $ENV{PERL5LIB} = defined($ENV{PERL5LIB})
-                           ? $ENV{PERL5LIB}
-                           : ($ENV{PERLLIB} || "");
-    local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : "";
-    $CPAN::META->set_perl5lib;
-    local $ENV{MAKEFLAGS}; # protect us from outer make calls
-
-  EXCUSE: {
-        my @e;
-        my $goodbye_message;
-        $self->debug("checking disabled id[$self->{ID}]") if $CPAN::DEBUG;
-        if ($self->prefs->{disabled} && ! $self->{force_update}) {
-            my $why = sprintf(
-                              "Disabled via prefs file '%s' doc %d",
-                              $self->{prefs_file},
-                              $self->{prefs_file_doc},
-                             );
-            push @e, $why;
-            $self->{unwrapped} = CPAN::Distrostatus->new("NO $why");
-            $goodbye_message = "[disabled] -- NA $why";
-            # note: not intended to be persistent but at least visible
-            # during this session
-        } else {
-            if (exists $self->{build_dir} && -d $self->{build_dir}
-                && ($self->{modulebuild}||$self->{writemakefile})
-               ) {
-                # this deserves print, not warn:
-                $CPAN::Frontend->myprint("  Has already been unwrapped into directory ".
-                                         "$self->{build_dir}\n"
-                                        );
-                return 1;
-            }
-
-            # although we talk about 'force' we shall not test on
-            # force directly. New model of force tries to refrain from
-            # direct checking of force.
-            exists $self->{unwrapped} and (
-                                           UNIVERSAL::can($self->{unwrapped},"failed") ?
-                                           $self->{unwrapped}->failed :
-                                           $self->{unwrapped} =~ /^NO/
-                                          )
-                and push @e, "Unwrapping had some problem, won't try again without force";
-        }
-        if (@e) {
-            $CPAN::Frontend->mywarn(join "", map {"$_\n"} @e);
-            if ($goodbye_message) {
-                 $self->goodbye($goodbye_message);
-            }
-            return;
-        }
-    }
-    my $sub_wd = CPAN::anycwd(); # for cleaning up as good as possible
-
-    my($local_file);
-    unless ($self->{build_dir} && -d $self->{build_dir}) {
-        $self->get_file_onto_local_disk;
-        return if $CPAN::Signal;
-        $self->check_integrity;
-        return if $CPAN::Signal;
-        (my $packagedir,$local_file) = $self->run_preps_on_packagedir;
-        if (exists $self->{writemakefile} && ref $self->{writemakefile}
-           && $self->{writemakefile}->can("failed") &&
-           $self->{writemakefile}->failed) {
-            return;
-        }
-        $packagedir ||= $self->{build_dir};
-        $self->{build_dir} = $packagedir;
-    }
-
-    if ($CPAN::Signal) {
-        $self->safe_chdir($sub_wd);
-        return;
-    }
-    return $self->choose_MM_or_MB($local_file);
-}
-
-#-> CPAN::Distribution::get_file_onto_local_disk
-sub get_file_onto_local_disk {
-    my($self) = @_;
-
-    return if $self->is_dot_dist;
-    my($local_file);
-    my($local_wanted) =
-        File::Spec->catfile(
-                            $CPAN::Config->{keep_source_where},
-                            "authors",
-                            "id",
-                            split(/\//,$self->id)
-                           );
-
-    $self->debug("Doing localize") if $CPAN::DEBUG;
-    unless ($local_file =
-            CPAN::FTP->localize("authors/id/$self->{ID}",
-                                $local_wanted)) {
-        my $note = "";
-        if ($CPAN::Index::DATE_OF_02) {
-            $note = "Note: Current database in memory was generated ".
-                "on $CPAN::Index::DATE_OF_02\n";
-        }
-        $CPAN::Frontend->mydie("Giving up on '$local_wanted'\n$note");
-    }
-
-    $self->debug("local_wanted[$local_wanted]local_file[$local_file]") if $CPAN::DEBUG;
-    $self->{localfile} = $local_file;
-}
-
-
-#-> CPAN::Distribution::check_integrity
-sub check_integrity {
-    my($self) = @_;
-
-    return if $self->is_dot_dist;
-    if ($CPAN::META->has_inst("Digest::SHA")) {
-        $self->debug("Digest::SHA is installed, verifying");
-        $self->verifyCHECKSUM;
-    } else {
-        $self->debug("Digest::SHA is NOT installed");
-    }
-}
-
-#-> CPAN::Distribution::run_preps_on_packagedir
-sub run_preps_on_packagedir {
-    my($self) = @_;
-    return if $self->is_dot_dist;
-
-    $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new(); # unsafe meta access, ok
-    my $builddir = $CPAN::META->{cachemgr}->dir; # unsafe meta access, ok
-    $self->safe_chdir($builddir);
-    $self->debug("Removing tmp-$$") if $CPAN::DEBUG;
-    File::Path::rmtree("tmp-$$");
-    unless (mkdir "tmp-$$", 0755) {
-        $CPAN::Frontend->unrecoverable_error(<<EOF);
-Couldn't mkdir '$builddir/tmp-$$': $!
-
-Cannot continue: Please find the reason why I cannot make the
-directory
-$builddir/tmp-$$
-and fix the problem, then retry.
-
-EOF
-    }
-    if ($CPAN::Signal) {
-        return;
-    }
-    $self->safe_chdir("tmp-$$");
-
-    #
-    # Unpack the goods
-    #
-    my $local_file = $self->{localfile};
-    my $ct = eval{CPAN::Tarzip->new($local_file)};
-    unless ($ct) {
-        $self->{unwrapped} = CPAN::Distrostatus->new("NO");
-        delete $self->{build_dir};
-        return;
-    }
-    if ($local_file =~ /(\.tar\.(bz2|gz|Z)|\.tgz)(?!\n)\Z/i) {
-        $self->{was_uncompressed}++ unless eval{$ct->gtest()};
-        $self->untar_me($ct);
-    } elsif ( $local_file =~ /\.zip(?!\n)\Z/i ) {
-        $self->unzip_me($ct);
-    } else {
-        $self->{was_uncompressed}++ unless $ct->gtest();
-        $local_file = $self->handle_singlefile($local_file);
-    }
-
-    # we are still in the tmp directory!
-    # Let's check if the package has its own directory.
-    my $dh = DirHandle->new(File::Spec->curdir)
-        or Carp::croak("Couldn't opendir .: $!");
-    my @readdir = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh->read; ### MAC??
-    if (grep { $_ eq "pax_global_header" } @readdir) {
-        $CPAN::Frontend->mywarn("Your (un)tar seems to have extracted a file named 'pax_global_header'
-from the tarball '$local_file'.
-This is almost certainly an error. Please upgrade your tar.
-I'll ignore this file for now.
-See also http://rt.cpan.org/Ticket/Display.html?id=38932\n");
-        $CPAN::Frontend->mysleep(5);
-        @readdir = grep { $_ ne "pax_global_header" } @readdir;
-    }
-    $dh->close;
-    my ($packagedir);
-    # XXX here we want in each branch File::Temp to protect all build_dir directories
-    if (CPAN->has_usable("File::Temp")) {
-        my $tdir_base;
-        my $from_dir;
-        my @dirents;
-        if (@readdir == 1 && -d $readdir[0]) {
-            $tdir_base = $readdir[0];
-            $from_dir = File::Spec->catdir(File::Spec->curdir,$readdir[0]);
-            my $dh2;
-            unless ($dh2 = DirHandle->new($from_dir)) {
-                my($mode) = (stat $from_dir)[2];
-                my $why = sprintf
-                    (
-                     "Couldn't opendir '%s', mode '%o': %s",
-                     $from_dir,
-                     $mode,
-                     $!,
-                    );
-                $CPAN::Frontend->mywarn("$why\n");
-                $self->{writemakefile} = CPAN::Distrostatus->new("NO -- $why");
-                return;
-            }
-            @dirents = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh2->read; ### MAC??
-        } else {
-            my $userid = $self->cpan_userid;
-            CPAN->debug("userid[$userid]");
-            if (!$userid or $userid eq "N/A") {
-                $userid = "anon";
-            }
-            $tdir_base = $userid;
-            $from_dir = File::Spec->curdir;
-            @dirents = @readdir;
-        }
-        $packagedir = File::Temp::tempdir(
-                                          "$tdir_base-XXXXXX",
-                                          DIR => $builddir,
-                                          CLEANUP => 0,
-                                         );
-        my $f;
-        for $f (@dirents) { # is already without "." and ".."
-            my $from = File::Spec->catdir($from_dir,$f);
-            my $to = File::Spec->catdir($packagedir,$f);
-            unless (File::Copy::move($from,$to)) {
-                my $err = $!;
-                $from = File::Spec->rel2abs($from);
-                Carp::confess("Couldn't move $from to $to: $err");
-            }
-        }
-    } else { # older code below, still better than nothing when there is no File::Temp
-        my($distdir);
-        if (@readdir == 1 && -d $readdir[0]) {
-            $distdir = $readdir[0];
-            $packagedir = File::Spec->catdir($builddir,$distdir);
-            $self->debug("packagedir[$packagedir]builddir[$builddir]distdir[$distdir]")
-                if $CPAN::DEBUG;
-            -d $packagedir and $CPAN::Frontend->myprint("Removing previously used ".
-                                                        "$packagedir\n");
-            File::Path::rmtree($packagedir);
-            unless (File::Copy::move($distdir,$packagedir)) {
-                $CPAN::Frontend->unrecoverable_error(<<EOF);
-Couldn't move '$distdir' to '$packagedir': $!
-
-Cannot continue: Please find the reason why I cannot move
-$builddir/tmp-$$/$distdir
-to
-$packagedir
-and fix the problem, then retry
-
-EOF
-            }
-            $self->debug(sprintf("moved distdir[%s] to packagedir[%s] -e[%s]-d[%s]",
-                                 $distdir,
-                                 $packagedir,
-                                 -e $packagedir,
-                                 -d $packagedir,
-                                )) if $CPAN::DEBUG;
-        } else {
-            my $userid = $self->cpan_userid;
-            CPAN->debug("userid[$userid]") if $CPAN::DEBUG;
-            if (!$userid or $userid eq "N/A") {
-                $userid = "anon";
-            }
-            my $pragmatic_dir = $userid . '000';
-            $pragmatic_dir =~ s/\W_//g;
-            $pragmatic_dir++ while -d "../$pragmatic_dir";
-            $packagedir = File::Spec->catdir($builddir,$pragmatic_dir);
-            $self->debug("packagedir[$packagedir]") if $CPAN::DEBUG;
-            File::Path::mkpath($packagedir);
-            my($f);
-            for $f (@readdir) { # is already without "." and ".."
-                my $to = File::Spec->catdir($packagedir,$f);
-                File::Copy::move($f,$to) or Carp::confess("Couldn't move $f to $to: $!");
-            }
-        }
-    }
-    $self->{build_dir} = $packagedir;
-    $self->safe_chdir($builddir);
-    File::Path::rmtree("tmp-$$");
-
-    $self->safe_chdir($packagedir);
-    $self->_signature_business();
-    $self->safe_chdir($builddir);
-
-    return($packagedir,$local_file);
-}
-
-#-> sub CPAN::Distribution::parse_meta_yml ;
-sub parse_meta_yml {
-    my($self) = @_;
-    my $build_dir = $self->{build_dir} or die "PANIC: cannot parse yaml without a build_dir";
-    my $yaml = File::Spec->catfile($build_dir,"META.yml");
-    $self->debug("yaml[$yaml]") if $CPAN::DEBUG;
-    return unless -f $yaml;
-    my $early_yaml;
-    eval {
-        require Parse::CPAN::Meta;
-        $early_yaml = Parse::CPAN::Meta::LoadFile($yaml)->[0];
-    };
-    unless ($early_yaml) {
-        eval { $early_yaml = CPAN->_yaml_loadfile($yaml)->[0]; };
-    }
-    unless ($early_yaml) {
-        return;
-    }
-    return $early_yaml;
-}
-
-#-> sub CPAN::Distribution::satisfy_requires ;
-sub satisfy_requires {
-    my ($self) = @_;
-    if (my @prereq = $self->unsat_prereq("later")) {
-        if ($prereq[0][0] eq "perl") {
-            my $need = "requires perl '$prereq[0][1]'";
-            my $id = $self->pretty_id;
-            $CPAN::Frontend->mywarn("$id $need; you have only $]; giving up\n");
-            $self->{make} = CPAN::Distrostatus->new("NO $need");
-            $self->store_persistent_state;
-            die "[prereq] -- NOT OK\n";
-        } else {
-            my $follow = eval { $self->follow_prereqs("later",@prereq); };
-            if (0) {
-            } elsif ($follow) {
-                # signal success to the queuerunner
-                return 1;
-            } elsif ($@ && ref $@ && $@->isa("CPAN::Exception::RecursiveDependency")) {
-                $CPAN::Frontend->mywarn($@);
-                die "[depend] -- NOT OK\n";
-            }
-        }
-    }
-}
-
-#-> sub CPAN::Distribution::satisfy_configure_requires ;
-sub satisfy_configure_requires {
-    my($self) = @_;
-    my $enable_configure_requires = 1;
-    if (!$enable_configure_requires) {
-        return 1;
-        # if we return 1 here, everything is as before we introduced
-        # configure_requires that means, things with
-        # configure_requires simply fail, all others succeed
-    }
-    my @prereq = $self->unsat_prereq("configure_requires_later") or return 1;
-    if ($self->{configure_requires_later}) {
-        for my $k (keys %{$self->{configure_requires_later_for}||{}}) {
-            if ($self->{configure_requires_later_for}{$k}>1) {
-                # we must not come here a second time
-                $CPAN::Frontend->mywarn("Panic: Some prerequisites is not available, please investigate...");
-                require YAML::Syck;
-                $CPAN::Frontend->mydie
-                    (
-                     YAML::Syck::Dump
-                     ({self=>$self, prereq=>\@prereq})
-                    );
-            }
-        }
-    }
-    if ($prereq[0][0] eq "perl") {
-        my $need = "requires perl '$prereq[0][1]'";
-        my $id = $self->pretty_id;
-        $CPAN::Frontend->mywarn("$id $need; you have only $]; giving up\n");
-        $self->{make} = CPAN::Distrostatus->new("NO $need");
-        $self->store_persistent_state;
-        return $self->goodbye("[prereq] -- NOT OK");
-    } else {
-        my $follow = eval {
-            $self->follow_prereqs("configure_requires_later", @prereq);
-        };
-        if (0) {
-        } elsif ($follow) {
-            return;
-        } elsif ($@ && ref $@ && $@->isa("CPAN::Exception::RecursiveDependency")) {
-            $CPAN::Frontend->mywarn($@);
-            return $self->goodbye("[depend] -- NOT OK");
-        }
-    }
-    die "never reached";
-}
-
-#-> sub CPAN::Distribution::choose_MM_or_MB ;
-sub choose_MM_or_MB {
-    my($self,$local_file) = @_;
-    $self->satisfy_configure_requires() or return;
-    my($mpl) = File::Spec->catfile($self->{build_dir},"Makefile.PL");
-    my($mpl_exists) = -f $mpl;
-    unless ($mpl_exists) {
-        # NFS has been reported to have racing problems after the
-        # renaming of a directory in some environments.
-        # This trick helps.
-        $CPAN::Frontend->mysleep(1);
-        my $mpldh = DirHandle->new($self->{build_dir})
-            or Carp::croak("Couldn't opendir $self->{build_dir}: $!");
-        $mpl_exists = grep /^Makefile\.PL$/, $mpldh->read;
-        $mpldh->close;
-    }
-    my $prefer_installer = "eumm"; # eumm|mb
-    if (-f File::Spec->catfile($self->{build_dir},"Build.PL")) {
-        if ($mpl_exists) { # they *can* choose
-            if ($CPAN::META->has_inst("Module::Build")) {
-                $prefer_installer = CPAN::HandleConfig->prefs_lookup($self,
-                                                                     q{prefer_installer});
-            }
-        } else {
-            $prefer_installer = "mb";
-        }
-    }
-    return unless $self->patch;
-    if (lc($prefer_installer) eq "rand") {
-        $prefer_installer = rand()<.5 ? "eumm" : "mb";
-    }
-    if (lc($prefer_installer) eq "mb") {
-        $self->{modulebuild} = 1;
-    } elsif ($self->{archived} eq "patch") {
-        # not an edge case, nothing to install for sure
-        my $why = "A patch file cannot be installed";
-        $CPAN::Frontend->mywarn("Refusing to handle this file: $why\n");
-        $self->{writemakefile} = CPAN::Distrostatus->new("NO $why");
-    } elsif (! $mpl_exists) {
-        $self->_edge_cases($mpl,$local_file);
-    }
-    if ($self->{build_dir}
-        &&
-        $CPAN::Config->{build_dir_reuse}
-       ) {
-        $self->store_persistent_state;
-    }
-    return $self;
-}
-
-#-> CPAN::Distribution::store_persistent_state
-sub store_persistent_state {
-    my($self) = @_;
-    my $dir = $self->{build_dir};
-    unless (File::Spec->canonpath(File::Basename::dirname($dir))
-            eq File::Spec->canonpath($CPAN::Config->{build_dir})) {
-        $CPAN::Frontend->mywarn("Directory '$dir' not below $CPAN::Config->{build_dir}, ".
-                                "will not store persistent state\n");
-        return;
-    }
-    my $file = sprintf "%s.yml", $dir;
-    my $yaml_module = CPAN::_yaml_module;
-    if ($CPAN::META->has_inst($yaml_module)) {
-        CPAN->_yaml_dumpfile(
-                             $file,
-                             {
-                              time => time,
-                              perl => CPAN::_perl_fingerprint,
-                              distribution => $self,
-                             }
-                            );
-    } else {
-        $CPAN::Frontend->myprint("Warning (usually harmless): '$yaml_module' not installed, ".
-                                "will not store persistent state\n");
-    }
-}
-
-#-> CPAN::Distribution::try_download
-sub try_download {
-    my($self,$patch) = @_;
-    my $norm = $self->normalize($patch);
-    my($local_wanted) =
-        File::Spec->catfile(
-                            $CPAN::Config->{keep_source_where},
-                            "authors",
-                            "id",
-                            split(/\//,$norm),
-                           );
-    $self->debug("Doing localize") if $CPAN::DEBUG;
-    return CPAN::FTP->localize("authors/id/$norm",
-                               $local_wanted);
-}
-
-{
-    my $stdpatchargs = "";
-    #-> CPAN::Distribution::patch
-    sub patch {
-        my($self) = @_;
-        $self->debug("checking patches id[$self->{ID}]") if $CPAN::DEBUG;
-        my $patches = $self->prefs->{patches};
-        $patches ||= "";
-        $self->debug("patches[$patches]") if $CPAN::DEBUG;
-        if ($patches) {
-            return unless @$patches;
-            $self->safe_chdir($self->{build_dir});
-            CPAN->debug("patches[$patches]") if $CPAN::DEBUG;
-            my $patchbin = $CPAN::Config->{patch};
-            unless ($patchbin && length $patchbin) {
-                $CPAN::Frontend->mydie("No external patch command configured\n\n".
-                                       "Please run 'o conf init /patch/'\n\n");
-            }
-            unless (MM->maybe_command($patchbin)) {
-                $CPAN::Frontend->mydie("No external patch command available\n\n".
-                                       "Please run 'o conf init /patch/'\n\n");
-            }
-            $patchbin = CPAN::HandleConfig->safe_quote($patchbin);
-            local $ENV{PATCH_GET} = 0; # formerly known as -g0
-            unless ($stdpatchargs) {
-                my $system = "$patchbin --version |";
-                local *FH;
-                open FH, $system or die "Could not fork '$system': $!";
-                local $/ = "\n";
-                my $pversion;
-              PARSEVERSION: while (<FH>) {
-                    if (/^patch\s+([\d\.]+)/) {
-                        $pversion = $1;
-                        last PARSEVERSION;
-                    }
-                }
-                if ($pversion) {
-                    $stdpatchargs = "-N --fuzz=3";
-                } else {
-                    $stdpatchargs = "-N";
-                }
-            }
-            my $countedpatches = @$patches == 1 ? "1 patch" : (scalar @$patches . " patches");
-            $CPAN::Frontend->myprint("Going to apply $countedpatches:\n");
-            for my $patch (@$patches) {
-                unless (-f $patch) {
-                    if (my $trydl = $self->try_download($patch)) {
-                        $patch = $trydl;
-                    } else {
-                        my $fail = "Could not find patch '$patch'";
-                        $CPAN::Frontend->mywarn("$fail; cannot continue\n");
-                        $self->{unwrapped} = CPAN::Distrostatus->new("NO -- $fail");
-                        delete $self->{build_dir};
-                        return;
-                    }
-                }
-                $CPAN::Frontend->myprint("  $patch\n");
-                my $readfh = CPAN::Tarzip->TIEHANDLE($patch);
-
-                my $pcommand;
-                my $ppp = $self->_patch_p_parameter($readfh);
-                if ($ppp eq "applypatch") {
-                    $pcommand = "$CPAN::Config->{applypatch} -verbose";
-                } else {
-                    my $thispatchargs = join " ", $stdpatchargs, $ppp;
-                    $pcommand = "$patchbin $thispatchargs";
-                }
-
-                $readfh = CPAN::Tarzip->TIEHANDLE($patch); # open again
-                my $writefh = FileHandle->new;
-                $CPAN::Frontend->myprint("  $pcommand\n");
-                unless (open $writefh, "|$pcommand") {
-                    my $fail = "Could not fork '$pcommand'";
-                    $CPAN::Frontend->mywarn("$fail; cannot continue\n");
-                    $self->{unwrapped} = CPAN::Distrostatus->new("NO -- $fail");
-                    delete $self->{build_dir};
-                    return;
-                }
-                while (my $x = $readfh->READLINE) {
-                    print $writefh $x;
-                }
-                unless (close $writefh) {
-                    my $fail = "Could not apply patch '$patch'";
-                    $CPAN::Frontend->mywarn("$fail; cannot continue\n");
-                    $self->{unwrapped} = CPAN::Distrostatus->new("NO -- $fail");
-                    delete $self->{build_dir};
-                    return;
-                }
-            }
-            $self->{patched}++;
-        }
-        return 1;
-    }
-}
-
-sub _patch_p_parameter {
-    my($self,$fh) = @_;
-    my $cnt_files   = 0;
-    my $cnt_p0files = 0;
-    local($_);
-    while ($_ = $fh->READLINE) {
-        if (
-            $CPAN::Config->{applypatch}
-            &&
-            /\#\#\#\# ApplyPatch data follows \#\#\#\#/
-           ) {
-            return "applypatch"
-        }
-        next unless /^[\*\+]{3}\s(\S+)/;
-        my $file = $1;
-        $cnt_files++;
-        $cnt_p0files++ if -f $file;
-        CPAN->debug("file[$file]cnt_files[$cnt_files]cnt_p0files[$cnt_p0files]")
-            if $CPAN::DEBUG;
-    }
-    return "-p1" unless $cnt_files;
-    return $cnt_files==$cnt_p0files ? "-p0" : "-p1";
-}
-
-#-> sub CPAN::Distribution::_edge_cases
-# with "configure" or "Makefile" or single file scripts
-sub _edge_cases {
-    my($self,$mpl,$local_file) = @_;
-    $self->debug(sprintf("makefilepl[%s]anycwd[%s]",
-                         $mpl,
-                         CPAN::anycwd(),
-                        )) if $CPAN::DEBUG;
-    my $build_dir = $self->{build_dir};
-    my($configure) = File::Spec->catfile($build_dir,"Configure");
-    if (-f $configure) {
-        # do we have anything to do?
-        $self->{configure} = $configure;
-    } elsif (-f File::Spec->catfile($build_dir,"Makefile")) {
-        $CPAN::Frontend->mywarn(qq{
-Package comes with a Makefile and without a Makefile.PL.
-We\'ll try to build it with that Makefile then.
-});
-        $self->{writemakefile} = CPAN::Distrostatus->new("YES");
-        $CPAN::Frontend->mysleep(2);
-    } else {
-        my $cf = $self->called_for || "unknown";
-        if ($cf =~ m|/|) {
-            $cf =~ s|.*/||;
-            $cf =~ s|\W.*||;
-        }
-        $cf =~ s|[/\\:]||g;     # risk of filesystem damage
-        $cf = "unknown" unless length($cf);
-        if (my $crap = $self->_contains_crap($build_dir)) {
-            my $why = qq{Package contains $crap; not recognized as a perl package, giving up};
-            $CPAN::Frontend->mywarn("$why\n");
-            $self->{writemakefile} = CPAN::Distrostatus->new(qq{NO -- $why});
-            return;
-        }
-        $CPAN::Frontend->mywarn(qq{Package seems to come without Makefile.PL.
-  (The test -f "$mpl" returned false.)
-  Writing one on our own (setting NAME to $cf)\a\n});
-        $self->{had_no_makefile_pl}++;
-        $CPAN::Frontend->mysleep(3);
-
-        # Writing our own Makefile.PL
-
-        my $exefile_stanza = "";
-        if ($self->{archived} eq "maybe_pl") {
-            $exefile_stanza = $self->_exefile_stanza($build_dir,$local_file);
-        }
-
-        my $fh = FileHandle->new;
-        $fh->open(">$mpl")
-            or Carp::croak("Could not open >$mpl: $!");
-        $fh->print(
-                   qq{# This Makefile.PL has been autogenerated by the module CPAN.pm
-# because there was no Makefile.PL supplied.
-# Autogenerated on: }.scalar localtime().qq{
-
-use ExtUtils::MakeMaker;
-WriteMakefile(
-              NAME => q[$cf],$exefile_stanza
-             );
-});
-        $fh->close;
-    }
-}
-
-#-> CPAN;:Distribution::_contains_crap
-sub _contains_crap {
-    my($self,$dir) = @_;
-    my(@dirs, $dh, @files);
-    opendir $dh, $dir or return;
-    my $dirent;
-    for $dirent (readdir $dh) {
-        next if $dirent =~ /^\.\.?$/;
-        my $path = File::Spec->catdir($dir,$dirent);
-        if (-d $path) {
-            push @dirs, $dirent;
-        } elsif (-f $path) {
-            push @files, $dirent;
-        }
-    }
-    if (@dirs && @files) {
-        return "both files[@files] and directories[@dirs]";
-    } elsif (@files > 2) {
-        return "several files[@files] but no Makefile.PL or Build.PL";
-    }
-    return;
-}
-
-#-> CPAN;:Distribution::_exefile_stanza
-sub _exefile_stanza {
-    my($self,$build_dir,$local_file) = @_;
-
-            my $fh = FileHandle->new;
-            my $script_file = File::Spec->catfile($build_dir,$local_file);
-            $fh->open($script_file)
-                or Carp::croak("Could not open script '$script_file': $!");
-            local $/ = "\n";
-            # name parsen und prereq
-            my($state) = "poddir";
-            my($name, $prereq) = ("", "");
-            while (<$fh>) {
-                if ($state eq "poddir" && /^=head\d\s+(\S+)/) {
-                    if ($1 eq 'NAME') {
-                        $state = "name";
-                    } elsif ($1 eq 'PREREQUISITES') {
-                        $state = "prereq";
-                    }
-                } elsif ($state =~ m{^(name|prereq)$}) {
-                    if (/^=/) {
-                        $state = "poddir";
-                    } elsif (/^\s*$/) {
-                        # nop
-                    } elsif ($state eq "name") {
-                        if ($name eq "") {
-                            ($name) = /^(\S+)/;
-                            $state = "poddir";
-                        }
-                    } elsif ($state eq "prereq") {
-                        $prereq .= $_;
-                    }
-                } elsif (/^=cut\b/) {
-                    last;
-                }
-            }
-            $fh->close;
-
-            for ($name) {
-                s{.*<}{};       # strip X<...>
-                s{>.*}{};
-            }
-            chomp $prereq;
-            $prereq = join " ", split /\s+/, $prereq;
-            my($PREREQ_PM) = join("\n", map {
-                s{.*<}{};       # strip X<...>
-                s{>.*}{};
-                if (/[\s\'\"]/) { # prose?
-                } else {
-                    s/[^\w:]$//; # period?
-                    " "x28 . "'$_' => 0,";
-                }
-            } split /\s*,\s*/, $prereq);
-
-            if ($name) {
-                my $to_file = File::Spec->catfile($build_dir, $name);
-                rename $script_file, $to_file
-                    or die "Can't rename $script_file to $to_file: $!";
-            }
-
-    return "
-              EXE_FILES => ['$name'],
-              PREREQ_PM => {
-$PREREQ_PM
-                           },
-";
-}
-
-#-> CPAN::Distribution::_signature_business
-sub _signature_business {
-    my($self) = @_;
-    my $check_sigs = CPAN::HandleConfig->prefs_lookup($self,
-                                                      q{check_sigs});
-    if ($check_sigs) {
-        if ($CPAN::META->has_inst("Module::Signature")) {
-            if (-f "SIGNATURE") {
-                $self->debug("Module::Signature is installed, verifying") if $CPAN::DEBUG;
-                my $rv = Module::Signature::verify();
-                if ($rv != Module::Signature::SIGNATURE_OK() and
-                    $rv != Module::Signature::SIGNATURE_MISSING()) {
-                    $CPAN::Frontend->mywarn(
-                                            qq{\nSignature invalid for }.
-                                            qq{distribution file. }.
-                                            qq{Please investigate.\n\n}
-                                           );
-
-                    my $wrap =
-                        sprintf(qq{I'd recommend removing %s. Some error occured    }.
-                                qq{while checking its signature, so it could        }.
-                                qq{be invalid. Maybe you have configured            }.
-                                qq{your 'urllist' with a bad URL. Please check this }.
-                                qq{array with 'o conf urllist' and retry. Or        }.
-                                qq{examine the distribution in a subshell. Try
-  look %s
-and run
-  cpansign -v
-},
-                                $self->{localfile},
-                                $self->pretty_id,
-                               );
-                    $self->{signature_verify} = CPAN::Distrostatus->new("NO");
-                    $CPAN::Frontend->mywarn(Text::Wrap::wrap("","",$wrap));
-                    $CPAN::Frontend->mysleep(5) if $CPAN::Frontend->can("mysleep");
-                } else {
-                    $self->{signature_verify} = CPAN::Distrostatus->new("YES");
-                    $self->debug("Module::Signature has verified") if $CPAN::DEBUG;
-                }
-            } else {
-                $CPAN::Frontend->mywarn(qq{Package came without SIGNATURE\n\n});
-            }
-        } else {
-            $self->debug("Module::Signature is NOT installed") if $CPAN::DEBUG;
-        }
-    }
-}
-
-#-> CPAN::Distribution::untar_me ;
-sub untar_me {
-    my($self,$ct) = @_;
-    $self->{archived} = "tar";
-    my $result = eval { $ct->untar() };
-    if ($result) {
-        $self->{unwrapped} = CPAN::Distrostatus->new("YES");
-    } else {
-        $self->{unwrapped} = CPAN::Distrostatus->new("NO -- untar failed");
-    }
-}
-
-# CPAN::Distribution::unzip_me ;
-sub unzip_me {
-    my($self,$ct) = @_;
-    $self->{archived} = "zip";
-    if ($ct->unzip()) {
-        $self->{unwrapped} = CPAN::Distrostatus->new("YES");
-    } else {
-        $self->{unwrapped} = CPAN::Distrostatus->new("NO -- unzip failed");
-    }
-    return;
-}
-
-sub handle_singlefile {
-    my($self,$local_file) = @_;
-
-    if ( $local_file =~ /\.pm(\.(gz|Z))?(?!\n)\Z/ ) {
-        $self->{archived} = "pm";
-    } elsif ( $local_file =~ /\.patch(\.(gz|bz2))?(?!\n)\Z/ ) {
-        $self->{archived} = "patch";
-    } else {
-        $self->{archived} = "maybe_pl";
-    }
-
-    my $to = File::Basename::basename($local_file);
-    if ($to =~ s/\.(gz|Z)(?!\n)\Z//) {
-        if (eval{CPAN::Tarzip->new($local_file)->gunzip($to)}) {
-            $self->{unwrapped} = CPAN::Distrostatus->new("YES");
-        } else {
-            $self->{unwrapped} = CPAN::Distrostatus->new("NO -- uncompressing failed");
-        }
-    } else {
-        if (File::Copy::cp($local_file,".")) {
-            $self->{unwrapped} = CPAN::Distrostatus->new("YES");
-        } else {
-            $self->{unwrapped} = CPAN::Distrostatus->new("NO -- copying failed");
-        }
-    }
-    return $to;
-}
-
-#-> sub CPAN::Distribution::new ;
-sub new {
-    my($class,%att) = @_;
-
-    # $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new();
-
-    my $this = { %att };
-    return bless $this, $class;
-}
-
-#-> sub CPAN::Distribution::look ;
-sub look {
-    my($self) = @_;
-
-    if ($^O eq 'MacOS') {
-      $self->Mac::BuildTools::look;
-      return;
-    }
-
-    if (  $CPAN::Config->{'shell'} ) {
-        $CPAN::Frontend->myprint(qq{
-Trying to open a subshell in the build directory...
-});
-    } else {
-        $CPAN::Frontend->myprint(qq{
-Your configuration does not define a value for subshells.
-Please define it with "o conf shell <your shell>"
-});
-        return;
-    }
-    my $dist = $self->id;
-    my $dir;
-    unless ($dir = $self->dir) {
-        $self->get;
-    }
-    unless ($dir ||= $self->dir) {
-        $CPAN::Frontend->mywarn(qq{
-Could not determine which directory to use for looking at $dist.
-});
-        return;
-    }
-    my $pwd  = CPAN::anycwd();
-    $self->safe_chdir($dir);
-    $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
-    {
-        local $ENV{CPAN_SHELL_LEVEL} = $ENV{CPAN_SHELL_LEVEL}||0;
-        $ENV{CPAN_SHELL_LEVEL} += 1;
-        my $shell = CPAN::HandleConfig->safe_quote($CPAN::Config->{'shell'});
-
-        local $ENV{PERL5LIB} = defined($ENV{PERL5LIB})
-            ? $ENV{PERL5LIB}
-                : ($ENV{PERLLIB} || "");
-
-        local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : "";
-        $CPAN::META->set_perl5lib;
-        local $ENV{MAKEFLAGS}; # protect us from outer make calls
-
-        unless (system($shell) == 0) {
-            my $code = $? >> 8;
-            $CPAN::Frontend->mywarn("Subprocess shell exit code $code\n");
-        }
-    }
-    $self->safe_chdir($pwd);
-}
-
-# CPAN::Distribution::cvs_import ;
-sub cvs_import {
-    my($self) = @_;
-    $self->get;
-    my $dir = $self->dir;
-
-    my $package = $self->called_for;
-    my $module = $CPAN::META->instance('CPAN::Module', $package);
-    my $version = $module->cpan_version;
-
-    my $userid = $self->cpan_userid;
-
-    my $cvs_dir = (split /\//, $dir)[-1];
-    $cvs_dir =~ s/-\d+[^-]+(?!\n)\Z//;
-    my $cvs_root =
-      $CPAN::Config->{cvsroot} || $ENV{CVSROOT};
-    my $cvs_site_perl =
-      $CPAN::Config->{cvs_site_perl} || $ENV{CVS_SITE_PERL};
-    if ($cvs_site_perl) {
-        $cvs_dir = "$cvs_site_perl/$cvs_dir";
-    }
-    my $cvs_log = qq{"imported $package $version sources"};
-    $version =~ s/\./_/g;
-    # XXX cvs: undocumented and unclear how it was meant to work
-    my @cmd = ('cvs', '-d', $cvs_root, 'import', '-m', $cvs_log,
-               "$cvs_dir", $userid, "v$version");
-
-    my $pwd  = CPAN::anycwd();
-    chdir($dir) or $CPAN::Frontend->mydie(qq{Could not chdir to "$dir": $!});
-
-    $CPAN::Frontend->myprint(qq{Working directory is $dir\n});
-
-    $CPAN::Frontend->myprint(qq{@cmd\n});
-    system(@cmd) == 0 or
-    # XXX cvs
-        $CPAN::Frontend->mydie("cvs import failed");
-    chdir($pwd) or $CPAN::Frontend->mydie(qq{Could not chdir to "$pwd": $!});
-}
-
-#-> sub CPAN::Distribution::readme ;
-sub readme {
-    my($self) = @_;
-    my($dist) = $self->id;
-    my($sans,$suffix) = $dist =~ /(.+)\.(tgz|tar[\._-]gz|tar\.Z|zip)$/;
-    $self->debug("sans[$sans] suffix[$suffix]\n") if $CPAN::DEBUG;
-    my($local_file);
-    my($local_wanted) =
-        File::Spec->catfile(
-                            $CPAN::Config->{keep_source_where},
-                            "authors",
-                            "id",
-                            split(/\//,"$sans.readme"),
-                           );
-    $self->debug("Doing localize") if $CPAN::DEBUG;
-    $local_file = CPAN::FTP->localize("authors/id/$sans.readme",
-                                      $local_wanted)
-        or $CPAN::Frontend->mydie(qq{No $sans.readme found});;
-
-    if ($^O eq 'MacOS') {
-        Mac::BuildTools::launch_file($local_file);
-        return;
-    }
-
-    my $fh_pager = FileHandle->new;
-    local($SIG{PIPE}) = "IGNORE";
-    my $pager = $CPAN::Config->{'pager'} || "cat";
-    $fh_pager->open("|$pager")
-        or die "Could not open pager $pager\: $!";
-    my $fh_readme = FileHandle->new;
-    $fh_readme->open($local_file)
-        or $CPAN::Frontend->mydie(qq{Could not open "$local_file": $!});
-    $CPAN::Frontend->myprint(qq{
-Displaying file
-  $local_file
-with pager "$pager"
-});
-    $fh_pager->print(<$fh_readme>);
-    $fh_pager->close;
-}
-
-#-> sub CPAN::Distribution::verifyCHECKSUM ;
-sub verifyCHECKSUM {
-    my($self) = @_;
-  EXCUSE: {
-        my @e;
-        $self->{CHECKSUM_STATUS} ||= "";
-        $self->{CHECKSUM_STATUS} eq "OK" and push @e, "Checksum was ok";
-        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
-    }
-    my($lc_want,$lc_file,@local,$basename);
-    @local = split(/\//,$self->id);
-    pop @local;
-    push @local, "CHECKSUMS";
-    $lc_want =
-        File::Spec->catfile($CPAN::Config->{keep_source_where},
-                            "authors", "id", @local);
-    local($") = "/";
-    if (my $size = -s $lc_want) {
-        $self->debug("lc_want[$lc_want]size[$size]") if $CPAN::DEBUG;
-        if ($self->CHECKSUM_check_file($lc_want,1)) {
-            return $self->{CHECKSUM_STATUS} = "OK";
-        }
-    }
-    $lc_file = CPAN::FTP->localize("authors/id/@local",
-                                   $lc_want,1);
-    unless ($lc_file) {
-        $CPAN::Frontend->myprint("Trying $lc_want.gz\n");
-        $local[-1] .= ".gz";
-        $lc_file = CPAN::FTP->localize("authors/id/@local",
-                                       "$lc_want.gz",1);
-        if ($lc_file) {
-            $lc_file =~ s/\.gz(?!\n)\Z//;
-            eval{CPAN::Tarzip->new("$lc_file.gz")->gunzip($lc_file)};
-        } else {
-            return;
-        }
-    }
-    if ($self->CHECKSUM_check_file($lc_file)) {
-        return $self->{CHECKSUM_STATUS} = "OK";
-    }
-}
-
-#-> sub CPAN::Distribution::SIG_check_file ;
-sub SIG_check_file {
-    my($self,$chk_file) = @_;
-    my $rv = eval { Module::Signature::_verify($chk_file) };
-
-    if ($rv == Module::Signature::SIGNATURE_OK()) {
-        $CPAN::Frontend->myprint("Signature for $chk_file ok\n");
-        return $self->{SIG_STATUS} = "OK";
-    } else {
-        $CPAN::Frontend->myprint(qq{\nSignature invalid for }.
-                                 qq{distribution file. }.
-                                 qq{Please investigate.\n\n}.
-                                 $self->as_string,
-                                 $CPAN::META->instance(
-                                                       'CPAN::Author',
-                                                       $self->cpan_userid
-                                                      )->as_string);
-
-        my $wrap = qq{I\'d recommend removing $chk_file. Its signature
-is invalid. Maybe you have configured your 'urllist' with
-a bad URL. Please check this array with 'o conf urllist', and
-retry.};
-
-        $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap));
-    }
-}
-
-#-> sub CPAN::Distribution::CHECKSUM_check_file ;
-
-# sloppy is 1 when we have an old checksums file that maybe is good
-# enough
-
-sub CHECKSUM_check_file {
-    my($self,$chk_file,$sloppy) = @_;
-    my($cksum,$file,$basename);
-
-    $sloppy ||= 0;
-    $self->debug("chk_file[$chk_file]sloppy[$sloppy]") if $CPAN::DEBUG;
-    my $check_sigs = CPAN::HandleConfig->prefs_lookup($self,
-                                                      q{check_sigs});
-    if ($check_sigs) {
-        if ($CPAN::META->has_inst("Module::Signature")) {
-            $self->debug("Module::Signature is installed, verifying") if $CPAN::DEBUG;
-            $self->SIG_check_file($chk_file);
-        } else {
-            $self->debug("Module::Signature is NOT installed") if $CPAN::DEBUG;
-        }
-    }
-
-    $file = $self->{localfile};
-    $basename = File::Basename::basename($file);
-    my $fh = FileHandle->new;
-    if (open $fh, $chk_file) {
-        local($/);
-        my $eval = <$fh>;
-        $eval =~ s/\015?\012/\n/g;
-        close $fh;
-        my($compmt) = Safe->new();
-        $cksum = $compmt->reval($eval);
-        if ($@) {
-            rename $chk_file, "$chk_file.bad";
-            Carp::confess($@) if $@;
-        }
-    } else {
-        Carp::carp "Could not open $chk_file for reading";
-    }
-
-    if (! ref $cksum or ref $cksum ne "HASH") {
-        $CPAN::Frontend->mywarn(qq{
-Warning: checksum file '$chk_file' broken.
-
-When trying to read that file I expected to get a hash reference
-for further processing, but got garbage instead.
-});
-        my $answer = CPAN::Shell::colorable_makemaker_prompt("Proceed nonetheless?", "no");
-        $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.\n");
-        $self->{CHECKSUM_STATUS} = "NIL -- CHECKSUMS file broken";
-        return;
-    } elsif (exists $cksum->{$basename}{sha256}) {
-        $self->debug("Found checksum for $basename:" .
-                     "$cksum->{$basename}{sha256}\n") if $CPAN::DEBUG;
-
-        open($fh, $file);
-        binmode $fh;
-        my $eq = $self->eq_CHECKSUM($fh,$cksum->{$basename}{sha256});
-        $fh->close;
-        $fh = CPAN::Tarzip->TIEHANDLE($file);
-
-        unless ($eq) {
-            my $dg = Digest::SHA->new(256);
-            my($data,$ref);
-            $ref = \$data;
-            while ($fh->READ($ref, 4096) > 0) {
-                $dg->add($data);
-            }
-            my $hexdigest = $dg->hexdigest;
-            $eq += $hexdigest eq $cksum->{$basename}{'sha256-ungz'};
-        }
-
-        if ($eq) {
-            $CPAN::Frontend->myprint("Checksum for $file ok\n");
-            return $self->{CHECKSUM_STATUS} = "OK";
-        } else {
-            $CPAN::Frontend->myprint(qq{\nChecksum mismatch for }.
-                                     qq{distribution file. }.
-                                     qq{Please investigate.\n\n}.
-                                     $self->as_string,
-                                     $CPAN::META->instance(
-                                                           'CPAN::Author',
-                                                           $self->cpan_userid
-                                                          )->as_string);
-
-            my $wrap = qq{I\'d recommend removing $file. Its
-checksum is incorrect. Maybe you have configured your 'urllist' with
-a bad URL. Please check this array with 'o conf urllist', and
-retry.};
-
-            $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap));
-
-            # former versions just returned here but this seems a
-            # serious threat that deserves a die
-
-            # $CPAN::Frontend->myprint("\n\n");
-            # sleep 3;
-            # return;
-        }
-        # close $fh if fileno($fh);
-    } else {
-        return if $sloppy;
-        unless ($self->{CHECKSUM_STATUS}) {
-            $CPAN::Frontend->mywarn(qq{
-Warning: No checksum for $basename in $chk_file.
-
-The cause for this may be that the file is very new and the checksum
-has not yet been calculated, but it may also be that something is
-going awry right now.
-});
-            my $answer = CPAN::Shell::colorable_makemaker_prompt("Proceed?", "yes");
-            $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.\n");
-        }
-        $self->{CHECKSUM_STATUS} = "NIL -- distro not in CHECKSUMS file";
-        return;
-    }
-}
-
-#-> sub CPAN::Distribution::eq_CHECKSUM ;
-sub eq_CHECKSUM {
-    my($self,$fh,$expect) = @_;
-    if ($CPAN::META->has_inst("Digest::SHA")) {
-        my $dg = Digest::SHA->new(256);
-        my($data);
-        while (read($fh, $data, 4096)) {
-            $dg->add($data);
-        }
-        my $hexdigest = $dg->hexdigest;
-        # warn "fh[$fh] hex[$hexdigest] aexp[$expectMD5]";
-        return $hexdigest eq $expect;
-    }
-    return 1;
-}
-
-#-> sub CPAN::Distribution::force ;
-
-# Both CPAN::Modules and CPAN::Distributions know if "force" is in
-# effect by autoinspection, not by inspecting a global variable. One
-# of the reason why this was chosen to work that way was the treatment
-# of dependencies. They should not automatically inherit the force
-# status. But this has the downside that ^C and die() will return to
-# the prompt but will not be able to reset the force_update
-# attributes. We try to correct for it currently in the read_metadata
-# routine, and immediately before we check for a Signal. I hope this
-# works out in one of v1.57_53ff
-
-# "Force get forgets previous error conditions"
-
-#-> sub CPAN::Distribution::fforce ;
-sub fforce {
-  my($self, $method) = @_;
-  $self->force($method,1);
-}
-
-#-> sub CPAN::Distribution::force ;
-sub force {
-  my($self, $method,$fforce) = @_;
-  my %phase_map = (
-                   get => [
-                           "unwrapped",
-                           "build_dir",
-                           "archived",
-                           "localfile",
-                           "CHECKSUM_STATUS",
-                           "signature_verify",
-                           "prefs",
-                           "prefs_file",
-                           "prefs_file_doc",
-                          ],
-                   make => [
-                            "writemakefile",
-                            "make",
-                            "modulebuild",
-                            "prereq_pm",
-                            "prereq_pm_detected",
-                           ],
-                   test => [
-                            "badtestcnt",
-                            "make_test",
-                           ],
-                   install => [
-                               "install",
-                              ],
-                   unknown => [
-                               "reqtype",
-                               "yaml_content",
-                              ],
-                  );
-  my $methodmatch = 0;
-  my $ldebug = 0;
- PHASE: for my $phase (qw(unknown get make test install)) { # order matters
-      $methodmatch = 1 if $fforce || $phase eq $method;
-      next unless $methodmatch;
-    ATTRIBUTE: for my $att (@{$phase_map{$phase}}) {
-          if ($phase eq "get") {
-              if (substr($self->id,-1,1) eq "."
-                  && $att =~ /(unwrapped|build_dir|archived)/ ) {
-                  # cannot be undone for local distros
-                  next ATTRIBUTE;
-              }
-              if ($att eq "build_dir"
-                  && $self->{build_dir}
-                  && $CPAN::META->{is_tested}
-                 ) {
-                  delete $CPAN::META->{is_tested}{$self->{build_dir}};
-              }
-          } elsif ($phase eq "test") {
-              if ($att eq "make_test"
-                  && $self->{make_test}
-                  && $self->{make_test}{COMMANDID}
-                  && $self->{make_test}{COMMANDID} == $CPAN::CurrentCommandId
-                 ) {
-                  # endless loop too likely
-                  next ATTRIBUTE;
-              }
-          }
-          delete $self->{$att};
-          if ($ldebug || $CPAN::DEBUG) {
-              # local $CPAN::DEBUG = 16; # Distribution
-              CPAN->debug(sprintf "id[%s]phase[%s]att[%s]", $self->id, $phase, $att);
-          }
-      }
-  }
-  if ($method && $method =~ /make|test|install/) {
-    $self->{force_update} = 1; # name should probably have been force_install
-  }
-}
-
-#-> sub CPAN::Distribution::notest ;
-sub notest {
-  my($self, $method) = @_;
-  # $CPAN::Frontend->mywarn("XDEBUG: set notest for $self $method");
-  $self->{"notest"}++; # name should probably have been force_install
-}
-
-#-> sub CPAN::Distribution::unnotest ;
-sub unnotest {
-  my($self) = @_;
-  # warn "XDEBUG: deleting notest";
-  delete $self->{notest};
-}
-
-#-> sub CPAN::Distribution::unforce ;
-sub unforce {
-  my($self) = @_;
-  delete $self->{force_update};
-}
-
-#-> sub CPAN::Distribution::isa_perl ;
-sub isa_perl {
-  my($self) = @_;
-  my $file = File::Basename::basename($self->id);
-  if ($file =~ m{ ^ perl
-                  -?
-                  (5)
-                  ([._-])
-                  (
-                   \d{3}(_[0-4][0-9])?
-                   |
-                   \d+\.\d+
-                  )
-                  \.tar[._-](?:gz|bz2)
-                  (?!\n)\Z
-                }xs) {
-    return "$1.$3";
-  } elsif ($self->cpan_comment
-           &&
-           $self->cpan_comment =~ /isa_perl\(.+?\)/) {
-    return $1;
-  }
-}
-
-
-#-> sub CPAN::Distribution::perl ;
-sub perl {
-    my ($self) = @_;
-    if (! $self) {
-        use Carp qw(carp);
-        carp __PACKAGE__ . "::perl was called without parameters.";
-    }
-    return CPAN::HandleConfig->safe_quote($CPAN::Perl);
-}
-
-
-#-> sub CPAN::Distribution::make ;
-sub make {
-    my($self) = @_;
-    if (my $goto = $self->prefs->{goto}) {
-        return $self->goto($goto);
-    }
-    my $make = $self->{modulebuild} ? "Build" : "make";
-    # Emergency brake if they said install Pippi and get newest perl
-    if ($self->isa_perl) {
-        if (
-            $self->called_for ne $self->id &&
-            ! $self->{force_update}
-        ) {
-            # if we die here, we break bundles
-            $CPAN::Frontend
-                ->mywarn(sprintf(
-                            qq{The most recent version "%s" of the module "%s"
-is part of the perl-%s distribution. To install that, you need to run
-  force install %s   --or--
-  install %s
-},
-                             $CPAN::META->instance(
-                                                   'CPAN::Module',
-                                                   $self->called_for
-                                                  )->cpan_version,
-                             $self->called_for,
-                             $self->isa_perl,
-                             $self->called_for,
-                             $self->id,
-                            ));
-            $self->{make} = CPAN::Distrostatus->new("NO isa perl");
-            $CPAN::Frontend->mysleep(1);
-            return;
-        }
-    }
-    $CPAN::Frontend->myprint(sprintf "Running %s for %s\n", $make, $self->id);
-    $self->get;
-    return if $self->prefs->{disabled} && ! $self->{force_update};
-    if ($self->{configure_requires_later}) {
-        return;
-    }
-    local $ENV{PERL5LIB} = defined($ENV{PERL5LIB})
-                           ? $ENV{PERL5LIB}
-                           : ($ENV{PERLLIB} || "");
-    local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : "";
-    $CPAN::META->set_perl5lib;
-    local $ENV{MAKEFLAGS}; # protect us from outer make calls
-
-    if ($CPAN::Signal) {
-        delete $self->{force_update};
-        return;
-    }
-
-    my $builddir;
-  EXCUSE: {
-        my @e;
-        if (!$self->{archived} || $self->{archived} eq "NO") {
-            push @e, "Is neither a tar nor a zip archive.";
-        }
-
-        if (!$self->{unwrapped}
-            || (
-                UNIVERSAL::can($self->{unwrapped},"failed") ?
-                $self->{unwrapped}->failed :
-                $self->{unwrapped} =~ /^NO/
-               )) {
-            push @e, "Had problems unarchiving. Please build manually";
-        }
-
-        unless ($self->{force_update}) {
-            exists $self->{signature_verify} and
-                (
-                 UNIVERSAL::can($self->{signature_verify},"failed") ?
-                 $self->{signature_verify}->failed :
-                 $self->{signature_verify} =~ /^NO/
-                )
-                and push @e, "Did not pass the signature test.";
-        }
-
-        if (exists $self->{writemakefile} &&
-            (
-             UNIVERSAL::can($self->{writemakefile},"failed") ?
-             $self->{writemakefile}->failed :
-             $self->{writemakefile} =~ /^NO/
-            )) {
-            # XXX maybe a retry would be in order?
-            my $err = UNIVERSAL::can($self->{writemakefile},"text") ?
-                $self->{writemakefile}->text :
-                    $self->{writemakefile};
-            $err =~ s/^NO\s*(--\s+)?//;
-            $err ||= "Had some problem writing Makefile";
-            $err .= ", won't make";
-            push @e, $err;
-        }
-
-        if (defined $self->{make}) {
-            if (UNIVERSAL::can($self->{make},"failed") ?
-                $self->{make}->failed :
-                $self->{make} =~ /^NO/) {
-                if ($self->{force_update}) {
-                    # Trying an already failed 'make' (unless somebody else blocks)
-                } else {
-                    # introduced for turning recursion detection into a distrostatus
-                    my $error = length $self->{make}>3
-                        ? substr($self->{make},3) : "Unknown error";
-                    $CPAN::Frontend->mywarn("Could not make: $error\n");
-                    $self->store_persistent_state;
-                    return;
-                }
-            } else {
-                push @e, "Has already been made";
-                my $wait_for_prereqs = eval { $self->satisfy_requires };
-                return 1 if $wait_for_prereqs;   # tells queuerunner to continue
-                return $self->goodbye($@) if $@; # tells queuerunner to stop
-            }
-        }
-
-        my $later = $self->{later} || $self->{configure_requires_later};
-        if ($later) { # see also undelay
-            if ($later) {
-                push @e, $later;
-            }
-        }
-
-        $CPAN::Frontend->myprint(join "", map {"  $_\n"} @e) and return if @e;
-        $builddir = $self->dir or
-            $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n");
-        unless (chdir $builddir) {
-            push @e, "Couldn't chdir to '$builddir': $!";
-        }
-        $CPAN::Frontend->mywarn(join "", map {"  $_\n"} @e) and return if @e;
-    }
-    if ($CPAN::Signal) {
-        delete $self->{force_update};
-        return;
-    }
-    $CPAN::Frontend->myprint("\n  CPAN.pm: Going to build ".$self->id."\n\n");
-    $self->debug("Changed directory to $builddir") if $CPAN::DEBUG;
-
-    if ($^O eq 'MacOS') {
-        Mac::BuildTools::make($self);
-        return;
-    }
-
-    my %env;
-    while (my($k,$v) = each %ENV) {
-        next unless defined $v;
-        $env{$k} = $v;
-    }
-    local %ENV = %env;
-    my $system;
-    my $pl_commandline;
-    if ($self->prefs->{pl}) {
-        $pl_commandline = $self->prefs->{pl}{commandline};
-    }
-    if ($pl_commandline) {
-        $system = $pl_commandline;
-        $ENV{PERL} = $^X;
-    } elsif ($self->{'configure'}) {
-        $system = $self->{'configure'};
-    } elsif ($self->{modulebuild}) {
-        my($perl) = $self->perl or die "Couldn\'t find executable perl\n";
-        $system = "$perl Build.PL $CPAN::Config->{mbuildpl_arg}";
-    } else {
-        my($perl) = $self->perl or die "Couldn\'t find executable perl\n";
-        my $switch = "";
-# This needs a handler that can be turned on or off:
-#        $switch = "-MExtUtils::MakeMaker ".
-#            "-Mops=:default,:filesys_read,:filesys_open,require,chdir"
-#            if $] > 5.00310;
-        my $makepl_arg = $self->_make_phase_arg("pl");
-        $ENV{PERL5_CPAN_IS_EXECUTING} = File::Spec->catfile($self->{build_dir},
-                                                            "Makefile.PL");
-        $system = sprintf("%s%s Makefile.PL%s",
-                          $perl,
-                          $switch ? " $switch" : "",
-                          $makepl_arg ? " $makepl_arg" : "",
-                         );
-    }
-    my $pl_env;
-    if ($self->prefs->{pl}) {
-        $pl_env = $self->prefs->{pl}{env};
-    }
-    if ($pl_env) {
-        for my $e (keys %$pl_env) {
-            $ENV{$e} = $pl_env->{$e};
-        }
-    }
-    if (exists $self->{writemakefile}) {
-    } else {
-        local($SIG{ALRM}) = sub { die "inactivity_timeout reached\n" };
-        my($ret,$pid,$output);
-        $@ = "";
-        my $go_via_alarm;
-        if ($CPAN::Config->{inactivity_timeout}) {
-            require Config;
-            if ($Config::Config{d_alarm}
-                &&
-                $Config::Config{d_alarm} eq "define"
-               ) {
-                $go_via_alarm++
-            } else {
-                $CPAN::Frontend->mywarn("Warning: you have configured the config ".
-                                        "variable 'inactivity_timeout' to ".
-                                        "'$CPAN::Config->{inactivity_timeout}'. But ".
-                                        "on this machine the system call 'alarm' ".
-                                        "isn't available. This means that we cannot ".
-                                        "provide the feature of intercepting long ".
-                                        "waiting code and will turn this feature off.\n"
-                                       );
-                $CPAN::Config->{inactivity_timeout} = 0;
-            }
-        }
-        if ($go_via_alarm) {
-            if ( $self->_should_report('pl') ) {
-                ($output, $ret) = CPAN::Reporter::record_command(
-                    $system,
-                    $CPAN::Config->{inactivity_timeout},
-                );
-                CPAN::Reporter::grade_PL( $self, $system, $output, $ret );
-            }
-            else {
-                eval {
-                    alarm $CPAN::Config->{inactivity_timeout};
-                    local $SIG{CHLD}; # = sub { wait };
-                    if (defined($pid = fork)) {
-                        if ($pid) { #parent
-                            # wait;
-                            waitpid $pid, 0;
-                        } else {    #child
-                            # note, this exec isn't necessary if
-                            # inactivity_timeout is 0. On the Mac I'd
-                            # suggest, we set it always to 0.
-                            exec $system;
-                        }
-                    } else {
-                        $CPAN::Frontend->myprint("Cannot fork: $!");
-                        return;
-                    }
-                };
-                alarm 0;
-                if ($@) {
-                    kill 9, $pid;
-                    waitpid $pid, 0;
-                    my $err = "$@";
-                    $CPAN::Frontend->myprint($err);
-                    $self->{writemakefile} = CPAN::Distrostatus->new("NO $err");
-                    $@ = "";
-                    $self->store_persistent_state;
-                    return $self->goodbye("$system -- TIMED OUT");
-                }
-            }
-        } else {
-            if (my $expect_model = $self->_prefs_with_expect("pl")) {
-                # XXX probably want to check _should_report here and warn
-                # about not being able to use CPAN::Reporter with expect
-                $ret = $self->_run_via_expect($system,'writemakefile',$expect_model);
-                if (! defined $ret
-                    && $self->{writemakefile}
-                    && $self->{writemakefile}->failed) {
-                    # timeout
-                    return;
-                }
-            }
-            elsif ( $self->_should_report('pl') ) {
-                ($output, $ret) = CPAN::Reporter::record_command($system);
-                CPAN::Reporter::grade_PL( $self, $system, $output, $ret );
-            }
-            else {
-                $ret = system($system);
-            }
-            if ($ret != 0) {
-                $self->{writemakefile} = CPAN::Distrostatus
-                    ->new("NO '$system' returned status $ret");
-                $CPAN::Frontend->mywarn("Warning: No success on command[$system]\n");
-                $self->store_persistent_state;
-                return $self->goodbye("$system -- NOT OK");
-            }
-        }
-        if (-f "Makefile" || -f "Build") {
-            $self->{writemakefile} = CPAN::Distrostatus->new("YES");
-            delete $self->{make_clean}; # if cleaned before, enable next
-        } else {
-            my $makefile = $self->{modulebuild} ? "Build" : "Makefile";
-            my $why = "No '$makefile' created";
-            $CPAN::Frontend->mywarn($why);
-            $self->{writemakefile} = CPAN::Distrostatus
-                ->new(qq{NO -- $why\n});
-            $self->store_persistent_state;
-            return $self->goodbye("$system -- NOT OK");
-        }
-    }
-    if ($CPAN::Signal) {
-        delete $self->{force_update};
-        return;
-    }
-    my $wait_for_prereqs = eval { $self->satisfy_requires };
-    return 1 if $wait_for_prereqs;   # tells queuerunner to continue
-    return $self->goodbye($@) if $@; # tells queuerunner to stop
-    if ($CPAN::Signal) {
-        delete $self->{force_update};
-        return;
-    }
-    my $make_commandline;
-    if ($self->prefs->{make}) {
-        $make_commandline = $self->prefs->{make}{commandline};
-    }
-    if ($make_commandline) {
-        $system = $make_commandline;
-        $ENV{PERL} = CPAN::find_perl;
-    } else {
-        if ($self->{modulebuild}) {
-            unless (-f "Build") {
-                my $cwd = CPAN::anycwd();
-                $CPAN::Frontend->mywarn("Alert: no Build file available for 'make $self->{id}'".
-                                        " in cwd[$cwd]. Danger, Will Robinson!\n");
-                $CPAN::Frontend->mysleep(5);
-            }
-            $system = join " ", $self->_build_command(), $CPAN::Config->{mbuild_arg};
-        } else {
-            $system = join " ", $self->_make_command(),  $CPAN::Config->{make_arg};
-        }
-        $system =~ s/\s+$//;
-        my $make_arg = $self->_make_phase_arg("make");
-        $system = sprintf("%s%s",
-                          $system,
-                          $make_arg ? " $make_arg" : "",
-                         );
-    }
-    my $make_env;
-    if ($self->prefs->{make}) {
-        $make_env = $self->prefs->{make}{env};
-    }
-    if ($make_env) { # overriding the local ENV of PL, not the outer
-                     # ENV, but unlikely to be a risk
-        for my $e (keys %$make_env) {
-            $ENV{$e} = $make_env->{$e};
-        }
-    }
-    my $expect_model = $self->_prefs_with_expect("make");
-    my $want_expect = 0;
-    if ( $expect_model && @{$expect_model->{talk}} ) {
-        my $can_expect = $CPAN::META->has_inst("Expect");
-        if ($can_expect) {
-            $want_expect = 1;
-        } else {
-            $CPAN::Frontend->mywarn("Expect not installed, falling back to ".
-                                    "system()\n");
-        }
-    }
-    my $system_ok;
-    if ($want_expect) {
-        # XXX probably want to check _should_report here and
-        # warn about not being able to use CPAN::Reporter with expect
-        $system_ok = $self->_run_via_expect($system,'make',$expect_model) == 0;
-    }
-    elsif ( $self->_should_report('make') ) {
-        my ($output, $ret) = CPAN::Reporter::record_command($system);
-        CPAN::Reporter::grade_make( $self, $system, $output, $ret );
-        $system_ok = ! $ret;
-    }
-    else {
-        $system_ok = system($system) == 0;
-    }
-    $self->introduce_myself;
-    if ( $system_ok ) {
-        $CPAN::Frontend->myprint("  $system -- OK\n");
-        $self->{make} = CPAN::Distrostatus->new("YES");
-    } else {
-        $self->{writemakefile} ||= CPAN::Distrostatus->new("YES");
-        $self->{make} = CPAN::Distrostatus->new("NO");
-        $CPAN::Frontend->mywarn("  $system -- NOT OK\n");
-    }
-    $self->store_persistent_state;
-}
-
-# CPAN::Distribution::goodbye ;
-sub goodbye {
-    my($self,$goodbye) = @_;
-    my $id = $self->pretty_id;
-    $CPAN::Frontend->mywarn("  $id\n  $goodbye\n");
-    return;
-}
-
-# CPAN::Distribution::_run_via_expect ;
-sub _run_via_expect {
-    my($self,$system,$phase,$expect_model) = @_;
-    CPAN->debug("system[$system]expect_model[$expect_model]") if $CPAN::DEBUG;
-    if ($CPAN::META->has_inst("Expect")) {
-        my $expo = Expect->new;  # expo Expect object;
-        $expo->spawn($system);
-        $expect_model->{mode} ||= "deterministic";
-        if ($expect_model->{mode} eq "deterministic") {
-            return $self->_run_via_expect_deterministic($expo,$phase,$expect_model);
-        } elsif ($expect_model->{mode} eq "anyorder") {
-            return $self->_run_via_expect_anyorder($expo,$phase,$expect_model);
-        } else {
-            die "Panic: Illegal expect mode: $expect_model->{mode}";
-        }
-    } else {
-        $CPAN::Frontend->mywarn("Expect not installed, falling back to system()\n");
-        return system($system);
-    }
-}
-
-sub _run_via_expect_anyorder {
-    my($self,$expo,$phase,$expect_model) = @_;
-    my $timeout = $expect_model->{timeout} || 5;
-    my $reuse = $expect_model->{reuse};
-    my @expectacopy = @{$expect_model->{talk}}; # we trash it!
-    my $but = "";
-    my $timeout_start = time;
-  EXPECT: while () {
-        my($eof,$ran_into_timeout);
-        # XXX not up to the full power of expect. one could certainly
-        # wrap all of the talk pairs into a single expect call and on
-        # success tweak it and step ahead to the next question. The
-        # current implementation unnecessarily limits itself to a
-        # single match.
-        my @match = $expo->expect(1,
-                                  [ eof => sub {
-                                        $eof++;
-                                    } ],
-                                  [ timeout => sub {
-                                        $ran_into_timeout++;
-                                    } ],
-                                  -re => eval"qr{.}",
-                                 );
-        if ($match[2]) {
-            $but .= $match[2];
-        }
-        $but .= $expo->clear_accum;
-        if ($eof) {
-            $expo->soft_close;
-            return $expo->exitstatus();
-        } elsif ($ran_into_timeout) {
-            # warn "DEBUG: they are asking a question, but[$but]";
-            for (my $i = 0; $i <= $#expectacopy; $i+=2) {
-                my($next,$send) = @expectacopy[$i,$i+1];
-                my $regex = eval "qr{$next}";
-                # warn "DEBUG: will compare with regex[$regex].";
-                if ($but =~ /$regex/) {
-                    # warn "DEBUG: will send send[$send]";
-                    $expo->send($send);
-                    # never allow reusing an QA pair unless they told us
-                    splice @expectacopy, $i, 2 unless $reuse;
-                    next EXPECT;
-                }
-            }
-            my $have_waited = time - $timeout_start;
-            if ($have_waited < $timeout) {
-                # warn "DEBUG: have_waited[$have_waited]timeout[$timeout]";
-                next EXPECT;
-            }
-            my $why = "could not answer a question during the dialog";
-            $CPAN::Frontend->mywarn("Failing: $why\n");
-            $self->{$phase} =
-                CPAN::Distrostatus->new("NO $why");
-            return 0;
-        }
-    }
-}
-
-sub _run_via_expect_deterministic {
-    my($self,$expo,$phase,$expect_model) = @_;
-    my $ran_into_timeout;
-    my $ran_into_eof;
-    my $timeout = $expect_model->{timeout} || 15; # currently unsettable
-    my $expecta = $expect_model->{talk};
-  EXPECT: for (my $i = 0; $i <= $#$expecta; $i+=2) {
-        my($re,$send) = @$expecta[$i,$i+1];
-        CPAN->debug("timeout[$timeout]re[$re]") if $CPAN::DEBUG;
-        my $regex = eval "qr{$re}";
-        $expo->expect($timeout,
-                      [ eof => sub {
-                            my $but = $expo->clear_accum;
-                            $CPAN::Frontend->mywarn("EOF (maybe harmless)
-expected[$regex]\nbut[$but]\n\n");
-                            $ran_into_eof++;
-                        } ],
-                      [ timeout => sub {
-                            my $but = $expo->clear_accum;
-                            $CPAN::Frontend->mywarn("TIMEOUT
-expected[$regex]\nbut[$but]\n\n");
-                            $ran_into_timeout++;
-                        } ],
-                      -re => $regex);
-        if ($ran_into_timeout) {
-            # note that the caller expects 0 for success
-            $self->{$phase} =
-                CPAN::Distrostatus->new("NO timeout during expect dialog");
-            return 0;
-        } elsif ($ran_into_eof) {
-            last EXPECT;
-        }
-        $expo->send($send);
-    }
-    $expo->soft_close;
-    return $expo->exitstatus();
-}
-
-#-> CPAN::Distribution::_validate_distropref
-sub _validate_distropref {
-    my($self,@args) = @_;
-    if (
-        $CPAN::META->has_inst("CPAN::Kwalify")
-        &&
-        $CPAN::META->has_inst("Kwalify")
-       ) {
-        eval {CPAN::Kwalify::_validate("distroprefs",@args);};
-        if ($@) {
-            $CPAN::Frontend->mywarn($@);
-        }
-    } else {
-        CPAN->debug("not validating '@args'") if $CPAN::DEBUG;
-    }
-}
-
-#-> CPAN::Distribution::_find_prefs
-sub _find_prefs {
-    my($self) = @_;
-    my $distroid = $self->pretty_id;
-    #CPAN->debug("distroid[$distroid]") if $CPAN::DEBUG;
-    my $prefs_dir = $CPAN::Config->{prefs_dir};
-    return if $prefs_dir =~ /^\s*$/;
-    eval { File::Path::mkpath($prefs_dir); };
-    if ($@) {
-        $CPAN::Frontend->mydie("Cannot create directory $prefs_dir");
-    }
-    my $yaml_module = CPAN::_yaml_module;
-    my $ext_map = {};
-    my @extensions;
-    if ($CPAN::META->has_inst($yaml_module)) {
-        $ext_map->{yml} = 'CPAN';
-    } else {
-        my @fallbacks;
-        if ($CPAN::META->has_inst("Data::Dumper")) {
-            push @fallbacks, $ext_map->{dd} = 'Data::Dumper';
-        }
-        if ($CPAN::META->has_inst("Storable")) {
-            push @fallbacks, $ext_map->{st} = 'Storable';
-        }
-        if (@fallbacks) {
-            local $" = " and ";
-            unless ($self->{have_complained_about_missing_yaml}++) {
-                $CPAN::Frontend->mywarn("'$yaml_module' not installed, falling back ".
-                                        "to @fallbacks to read prefs '$prefs_dir'\n");
-            }
-        } else {
-            unless ($self->{have_complained_about_missing_yaml}++) {
-                $CPAN::Frontend->mywarn("'$yaml_module' not installed, cannot ".
-                                        "read prefs '$prefs_dir'\n");
-            }
-        }
-    }
-    my $finder = CPAN::Distroprefs->find($prefs_dir, $ext_map);
-    DIRENT: while (my $result = $finder->next) {
-        if ($result->is_warning) {
-            $CPAN::Frontend->mywarn($result->as_string);
-            $CPAN::Frontend->mysleep(1);
-            next DIRENT;
-        } elsif ($result->is_fatal) {
-            $CPAN::Frontend->mydie($result->as_string);
-        }
-
-        my @prefs = @{ $result->prefs };
-
-      ELEMENT: for my $y (0..$#prefs) {
-            my $pref = $prefs[$y];
-            $self->_validate_distropref($pref->data, $result->abs, $y);
-
-            # I don't know why we silently skip when there's no match, but
-            # complain if there's an empty match hashref, and there's no
-            # comment explaining why -- hdp, 2008-03-18
-            unless ($pref->has_any_match) {
-                next ELEMENT;
-            }
-
-            unless ($pref->has_valid_subkeys) {
-                $CPAN::Frontend->mydie(sprintf
-                    "Nonconforming .%s file '%s': " .
-                    "missing match/* subattribute. " .
-                    "Please remove, cannot continue.",
-                    $result->ext, $result->abs,
-                );
-            }
-
-            my $arg = {
-                env          => \%ENV,
-                distribution => $distroid,
-                perl         => \&CPAN::find_perl,
-                perlconfig   => \%Config::Config,
-                module       => sub { [ $self->containsmods ] },
-            };
-
-            if ($pref->matches($arg)) {
-                return {
-                    prefs => $pref->data,
-                    prefs_file => $result->abs,
-                    prefs_file_doc => $y,
-                };
-            }
-
-        }
-    }
-    return;
-}
-
-# CPAN::Distribution::prefs
-sub prefs {
-    my($self) = @_;
-    if (exists $self->{negative_prefs_cache}
-        &&
-        $self->{negative_prefs_cache} != $CPAN::CurrentCommandId
-       ) {
-        delete $self->{negative_prefs_cache};
-        delete $self->{prefs};
-    }
-    if (exists $self->{prefs}) {
-        return $self->{prefs}; # XXX comment out during debugging
-    }
-    if ($CPAN::Config->{prefs_dir}) {
-        CPAN->debug("prefs_dir[$CPAN::Config->{prefs_dir}]") if $CPAN::DEBUG;
-        my $prefs = $self->_find_prefs();
-        $prefs ||= ""; # avoid warning next line
-        CPAN->debug("prefs[$prefs]") if $CPAN::DEBUG;
-        if ($prefs) {
-            for my $x (qw(prefs prefs_file prefs_file_doc)) {
-                $self->{$x} = $prefs->{$x};
-            }
-            my $bs = sprintf(
-                             "%s[%s]",
-                             File::Basename::basename($self->{prefs_file}),
-                             $self->{prefs_file_doc},
-                            );
-            my $filler1 = "_" x 22;
-            my $filler2 = int(66 - length($bs))/2;
-            $filler2 = 0 if $filler2 < 0;
-            $filler2 = " " x $filler2;
-            $CPAN::Frontend->myprint("
-$filler1 D i s t r o P r e f s $filler1
-$filler2 $bs $filler2
-");
-            $CPAN::Frontend->mysleep(1);
-            return $self->{prefs};
-        }
-    }
-    $self->{negative_prefs_cache} = $CPAN::CurrentCommandId;
-    return $self->{prefs} = +{};
-}
-
-# CPAN::Distribution::_make_phase_arg
-sub _make_phase_arg {
-    my($self, $phase) = @_;
-    my $_make_phase_arg;
-    my $prefs = $self->prefs;
-    if (
-        $prefs
-        && exists $prefs->{$phase}
-        && exists $prefs->{$phase}{args}
-        && $prefs->{$phase}{args}
-       ) {
-        $_make_phase_arg = join(" ",
-                           map {CPAN::HandleConfig
-                                 ->safe_quote($_)} @{$prefs->{$phase}{args}},
-                          );
-    }
-
-# cpan[2]> o conf make[TAB]
-# make                       make_install_make_command
-# make_arg                   makepl_arg
-# make_install_arg
-# cpan[2]> o conf mbuild[TAB]
-# mbuild_arg                    mbuild_install_build_command
-# mbuild_install_arg            mbuildpl_arg
-
-    my $mantra; # must switch make/mbuild here
-    if ($self->{modulebuild}) {
-        $mantra = "mbuild";
-    } else {
-        $mantra = "make";
-    }
-    my %map = (
-               pl => "pl_arg",
-               make => "_arg",
-               test => "_test_arg", # does not really exist but maybe
-                                    # will some day and now protects
-                                    # us from unini warnings
-               install => "_install_arg",
-              );
-    my $phase_underscore_meshup = $map{$phase};
-    my $what = sprintf "%s%s", $mantra, $phase_underscore_meshup;
-
-    $_make_phase_arg ||= $CPAN::Config->{$what};
-    return $_make_phase_arg;
-}
-
-# CPAN::Distribution::_make_command
-sub _make_command {
-    my ($self) = @_;
-    if ($self) {
-        return
-            CPAN::HandleConfig
-                ->safe_quote(
-                             CPAN::HandleConfig->prefs_lookup($self,
-                                                              q{make})
-                             || $Config::Config{make}
-                             || 'make'
-                            );
-    } else {
-        # Old style call, without object. Deprecated
-        Carp::confess("CPAN::_make_command() used as function. Don't Do That.");
-        return
-          safe_quote(undef,
-                     CPAN::HandleConfig->prefs_lookup($self,q{make})
-                     || $CPAN::Config->{make}
-                     || $Config::Config{make}
-                     || 'make');
-    }
-}
-
-#-> sub CPAN::Distribution::follow_prereqs ;
-sub follow_prereqs {
-    my($self) = shift;
-    my($slot) = shift;
-    my(@prereq_tuples) = grep {$_->[0] ne "perl"} @_;
-    return unless @prereq_tuples;
-    my(@good_prereq_tuples);
-    for my $p (@prereq_tuples) {
-        # XXX watch out for foul ones
-        push @good_prereq_tuples, $p;
-    }
-    my $pretty_id = $self->pretty_id;
-    my %map = (
-               b => "build_requires",
-               r => "requires",
-               c => "commandline",
-              );
-    my($filler1,$filler2,$filler3,$filler4);
-    my $unsat = "Unsatisfied dependencies detected during";
-    my $w = length($unsat) > length($pretty_id) ? length($unsat) : length($pretty_id);
-    {
-        my $r = int(($w - length($unsat))/2);
-        my $l = $w - length($unsat) - $r;
-        $filler1 = "-"x4 . " "x$l;
-        $filler2 = " "x$r . "-"x4 . "\n";
-    }
-    {
-        my $r = int(($w - length($pretty_id))/2);
-        my $l = $w - length($pretty_id) - $r;
-        $filler3 = "-"x4 . " "x$l;
-        $filler4 = " "x$r . "-"x4 . "\n";
-    }
-    $CPAN::Frontend->
-        myprint("$filler1 $unsat $filler2".
-                "$filler3 $pretty_id $filler4".
-                join("", map {"    $_->[0] \[$map{$_->[1]}]\n"} @good_prereq_tuples),
-               );
-    my $follow = 0;
-    if ($CPAN::Config->{prerequisites_policy} eq "follow") {
-        $follow = 1;
-    } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") {
-        my $answer = CPAN::Shell::colorable_makemaker_prompt(
-"Shall I follow them and prepend them to the queue
-of modules we are processing right now?", "yes");
-        $follow = $answer =~ /^\s*y/i;
-    } else {
-        my @prereq = map { $_=>[0] } @good_prereq_tuples;
-        local($") = ", ";
-        $CPAN::Frontend->
-            myprint("  Ignoring dependencies on modules @prereq\n");
-    }
-    if ($follow) {
-        my $id = $self->id;
-        # color them as dirty
-        for my $gp (@good_prereq_tuples) {
-            # warn "calling color_cmd_tmps(0,1)";
-            my $p = $gp->[0];
-            my $any = CPAN::Shell->expandany($p);
-            $self->{$slot . "_for"}{$any->id}++;
-            if ($any) {
-                $any->color_cmd_tmps(0,2);
-            } else {
-                $CPAN::Frontend->mywarn("Warning (maybe a bug): Cannot expand prereq '$p'\n");
-                $CPAN::Frontend->mysleep(2);
-            }
-        }
-        # queue them and re-queue yourself
-        CPAN::Queue->jumpqueue({qmod => $id, reqtype => $self->{reqtype}},
-                               map {+{qmod=>$_->[0],reqtype=>$_->[1]}} reverse @good_prereq_tuples);
-        $self->{$slot} = "Delayed until after prerequisites";
-        return 1; # signal success to the queuerunner
-    }
-    return;
-}
-
-sub _feature_depends {
-    my($self) = @_;
-    my $meta_yml = $self->parse_meta_yml();
-    my $optf = $meta_yml->{optional_features} or return;
-    if (!ref $optf or ref $optf ne "HASH"){
-        $CPAN::Frontend->mywarn("The content of optional_features is not a HASH reference. Cannot use it.\n");
-        $optf = {};
-    }
-    my $wantf = $self->prefs->{features} or return;
-    if (!ref $wantf or ref $wantf ne "ARRAY"){
-        $CPAN::Frontend->mywarn("The content of 'features' is not an ARRAY reference. Cannot use it.\n");
-        $wantf = [];
-    }
-    my $dep = +{};
-    for my $wf (@$wantf) {
-        if (my $f = $optf->{$wf}) {
-            $CPAN::Frontend->myprint("Found the demanded feature '$wf' that ".
-                                     "is accompanied by this description:\n".
-                                     $f->{description}.
-                                     "\n\n"
-                                    );
-            # configure_requires currently not in the spec, unlikely to be useful anyway
-            for my $reqtype (qw(configure_requires build_requires requires)) {
-                my $reqhash = $f->{$reqtype} or next;
-                while (my($k,$v) = each %$reqhash) {
-                    $dep->{$reqtype}{$k} = $v;
-                }
-            }
-        } else {
-            $CPAN::Frontend->mywarn("The demanded feature '$wf' was not ".
-                                    "found in the META.yml file".
-                                    "\n\n"
-                                   );
-        }
-    }
-    $dep;
-}
-
-#-> sub CPAN::Distribution::unsat_prereq ;
-# return ([Foo,"r"],[Bar,"b"]) for normal modules
-# return ([perl=>5.008]) if we need a newer perl than we are running under
-# (sorry for the inconsistency, it was an accident)
-sub unsat_prereq {
-    my($self,$slot) = @_;
-    my(%merged,$prereq_pm);
-    my $prefs_depends = $self->prefs->{depends}||{};
-    my $feature_depends = $self->_feature_depends();
-    if ($slot eq "configure_requires_later") {
-        my $meta_yml = $self->parse_meta_yml();
-        if (defined $meta_yml && (! ref $meta_yml || ref $meta_yml ne "HASH")) {
-            $CPAN::Frontend->mywarn("The content of META.yml is defined but not a HASH reference. Cannot use it.\n");
-            $meta_yml = +{};
-        }
-        %merged = (
-                   %{$meta_yml->{configure_requires}||{}},
-                   %{$prefs_depends->{configure_requires}||{}},
-                   %{$feature_depends->{configure_requires}||{}},
-                  );
-        $prereq_pm = {}; # configure_requires defined as "b"
-    } elsif ($slot eq "later") {
-        my $prereq_pm_0 = $self->prereq_pm || {};
-        for my $reqtype (qw(requires build_requires)) {
-            $prereq_pm->{$reqtype} = {%{$prereq_pm_0->{$reqtype}||{}}}; # copy to not pollute it
-            for my $dep ($prefs_depends,$feature_depends) {
-                for my $k (keys %{$dep->{$reqtype}||{}}) {
-                    $prereq_pm->{$reqtype}{$k} = $dep->{$reqtype}{$k};
-                }
-            }
-        }
-        %merged = (%{$prereq_pm->{requires}||{}},%{$prereq_pm->{build_requires}||{}});
-    } else {
-        die "Panic: illegal slot '$slot'";
-    }
-    my(@need);
-    my @merged = %merged;
-    CPAN->debug("all merged_prereqs[@merged]") if $CPAN::DEBUG;
-  NEED: while (my($need_module, $need_version) = each %merged) {
-        my($available_version,$available_file,$nmo);
-        if ($need_module eq "perl") {
-            $available_version = $];
-            $available_file = CPAN::find_perl;
-        } else {
-            $nmo = $CPAN::META->instance("CPAN::Module",$need_module);
-            next if $nmo->uptodate;
-            $available_file = $nmo->available_file;
-
-            # if they have not specified a version, we accept any installed one
-            if (defined $available_file
-                and ( # a few quick shortcurcuits
-                     not defined $need_version
-                     or $need_version eq '0'    # "==" would trigger warning when not numeric
-                     or $need_version eq "undef"
-                    )) {
-                next NEED;
-            }
-
-            $available_version = $nmo->available_version;
-        }
-
-        # We only want to install prereqs if either they're not installed
-        # or if the installed version is too old. We cannot omit this
-        # check, because if 'force' is in effect, nobody else will check.
-        if (defined $available_file) {
-            my $fulfills_all_version_rqs = $self->_fulfills_all_version_rqs
-                ($need_module,$available_file,$available_version,$need_version);
-            next NEED if $fulfills_all_version_rqs;
-        }
-
-        if ($need_module eq "perl") {
-            return ["perl", $need_version];
-        }
-        $self->{sponsored_mods}{$need_module} ||= 0;
-        CPAN->debug("need_module[$need_module]s/s/n[$self->{sponsored_mods}{$need_module}]") if $CPAN::DEBUG;
-        if (my $sponsoring = $self->{sponsored_mods}{$need_module}++) {
-            # We have already sponsored it and for some reason it's still
-            # not available. So we do ... what??
-
-            # if we push it again, we have a potential infinite loop
-
-            # The following "next" was a very problematic construct.
-            # It helped a lot but broke some day and had to be
-            # replaced.
-
-            # We must be able to deal with modules that come again and
-            # again as a prereq and have themselves prereqs and the
-            # queue becomes long but finally we would find the correct
-            # order. The RecursiveDependency check should trigger a
-            # die when it's becoming too weird. Unfortunately removing
-            # this next breaks many other things.
-
-            # The bug that brought this up is described in Todo under
-            # "5.8.9 cannot install Compress::Zlib"
-
-            # next; # this is the next that had to go away
-
-            # The following "next NEED" are fine and the error message
-            # explains well what is going on. For example when the DBI
-            # fails and consequently DBD::SQLite fails and now we are
-            # processing CPAN::SQLite. Then we must have a "next" for
-            # DBD::SQLite. How can we get it and how can we identify
-            # all other cases we must identify?
-
-            my $do = $nmo->distribution;
-            next NEED unless $do; # not on CPAN
-            if (CPAN::Version->vcmp($need_version, $nmo->ro->{CPAN_VERSION}) > 0){
-                $CPAN::Frontend->mywarn("Warning: Prerequisite ".
-                                        "'$need_module => $need_version' ".
-                                        "for '$self->{ID}' seems ".
-                                        "not available according to the indexes\n"
-                                       );
-                next NEED;
-            }
-          NOSAYER: for my $nosayer (
-                                    "unwrapped",
-                                    "writemakefile",
-                                    "signature_verify",
-                                    "make",
-                                    "make_test",
-                                    "install",
-                                    "make_clean",
-                                   ) {
-                if ($do->{$nosayer}) {
-                    my $selfid = $self->pretty_id;
-                    my $did = $do->pretty_id;
-                    if (UNIVERSAL::can($do->{$nosayer},"failed") ?
-                        $do->{$nosayer}->failed :
-                        $do->{$nosayer} =~ /^NO/) {
-                        if ($nosayer eq "make_test"
-                            &&
-                            $do->{make_test}{COMMANDID} != $CPAN::CurrentCommandId
-                           ) {
-                            next NOSAYER;
-                        }
-                        $CPAN::Frontend->mywarn("Warning: Prerequisite ".
-                                                "'$need_module => $need_version' ".
-                                                "for '$selfid' failed when ".
-                                                "processing '$did' with ".
-                                                "'$nosayer => $do->{$nosayer}'. Continuing, ".
-                                                "but chances to succeed are limited.\n"
-                                               );
-                        $CPAN::Frontend->mysleep($sponsoring/10);
-                        next NEED;
-                    } else { # the other guy succeeded
-                        if ($nosayer =~ /^(install|make_test)$/) {
-                            # we had this with
-                            # DMAKI/DateTime-Calendar-Chinese-0.05.tar.gz
-                            # in 2007-03 for 'make install'
-                            # and 2008-04: #30464 (for 'make test')
-                            $CPAN::Frontend->mywarn("Warning: Prerequisite ".
-                                                    "'$need_module => $need_version' ".
-                                                    "for '$selfid' already built ".
-                                                    "but the result looks suspicious. ".
-                                                    "Skipping another build attempt, ".
-                                                    "to prevent looping endlessly.\n"
-                                                   );
-                            next NEED;
-                        }
-                    }
-                }
-            }
-        }
-        my $needed_as = exists $prereq_pm->{requires}{$need_module} ? "r" : "b";
-        push @need, [$need_module,$needed_as];
-    }
-    my @unfolded = map { "[".join(",",@$_)."]" } @need;
-    CPAN->debug("returning from unsat_prereq[@unfolded]") if $CPAN::DEBUG;
-    @need;
-}
-
-sub _fulfills_all_version_rqs {
-    my($self,$need_module,$available_file,$available_version,$need_version) = @_;
-    my(@all_requirements) = split /\s*,\s*/, $need_version;
-    local($^W) = 0;
-    my $ok = 0;
-  RQ: for my $rq (@all_requirements) {
-        if ($rq =~ s|>=\s*||) {
-        } elsif ($rq =~ s|>\s*||) {
-            # 2005-12: one user
-            if (CPAN::Version->vgt($available_version,$rq)) {
-                $ok++;
-            }
-            next RQ;
-        } elsif ($rq =~ s|!=\s*||) {
-            # 2005-12: no user
-            if (CPAN::Version->vcmp($available_version,$rq)) {
-                $ok++;
-                next RQ;
-            } else {
-                last RQ;
-            }
-        } elsif ($rq =~ m|<=?\s*|) {
-            # 2005-12: no user
-            $CPAN::Frontend->mywarn("Downgrading not supported (rq[$rq])\n");
-            $ok++;
-            next RQ;
-        }
-        if (! CPAN::Version->vgt($rq, $available_version)) {
-            $ok++;
-        }
-        CPAN->debug(sprintf("need_module[%s]available_file[%s]".
-                            "available_version[%s]rq[%s]ok[%d]",
-                            $need_module,
-                            $available_file,
-                            $available_version,
-                            CPAN::Version->readable($rq),
-                            $ok,
-                           )) if $CPAN::DEBUG;
-    }
-    return $ok == @all_requirements;
-}
-
-#-> sub CPAN::Distribution::read_yaml ;
-sub read_yaml {
-    my($self) = @_;
-    return $self->{yaml_content} if exists $self->{yaml_content};
-    my $build_dir;
-    unless ($build_dir = $self->{build_dir}) {
-        # maybe permission on build_dir was missing
-        $CPAN::Frontend->mywarn("Warning: cannot determine META.yml without a build_dir.\n");
-        return;
-    }
-    my $yaml = File::Spec->catfile($build_dir,"META.yml");
-    $self->debug("yaml[$yaml]") if $CPAN::DEBUG;
-    return unless -f $yaml;
-    eval { $self->{yaml_content} = CPAN->_yaml_loadfile($yaml)->[0]; };
-    if ($@) {
-        $CPAN::Frontend->mywarn("Could not read ".
-                                "'$yaml'. Falling back to other ".
-                                "methods to determine prerequisites\n");
-        return $self->{yaml_content} = undef; # if we die, then we
-                                              # cannot read YAML's own
-                                              # META.yml
-    }
-    # not "authoritative"
-    for ($self->{yaml_content}) {
-        if (defined $_ && (! ref $_ || ref $_ ne "HASH")) {
-            $CPAN::Frontend->mywarn("META.yml does not seem to be conforming, cannot use it.\n");
-            $self->{yaml_content} = +{};
-        }
-    }
-    if (not exists $self->{yaml_content}{dynamic_config}
-        or $self->{yaml_content}{dynamic_config}
-       ) {
-        $self->{yaml_content} = undef;
-    }
-    $self->debug(sprintf "yaml_content[%s]", $self->{yaml_content} || "UNDEF")
-        if $CPAN::DEBUG;
-    return $self->{yaml_content};
-}
-
-#-> sub CPAN::Distribution::prereq_pm ;
-sub prereq_pm {
-    my($self) = @_;
-    $self->{prereq_pm_detected} ||= 0;
-    CPAN->debug("ID[$self->{ID}]prereq_pm_detected[$self->{prereq_pm_detected}]") if $CPAN::DEBUG;
-    return $self->{prereq_pm} if $self->{prereq_pm_detected};
-    return unless $self->{writemakefile}  # no need to have succeeded
-                                          # but we must have run it
-        || $self->{modulebuild};
-    unless ($self->{build_dir}) {
-        return;
-    }
-    CPAN->debug(sprintf "writemakefile[%s]modulebuild[%s]",
-                $self->{writemakefile}||"",
-                $self->{modulebuild}||"",
-               ) if $CPAN::DEBUG;
-    my($req,$breq);
-    if (my $yaml = $self->read_yaml) { # often dynamic_config prevents a result here
-        $req =  $yaml->{requires} || {};
-        $breq =  $yaml->{build_requires} || {};
-        undef $req unless ref $req eq "HASH" && %$req;
-        if ($req) {
-            if ($yaml->{generated_by} &&
-                $yaml->{generated_by} =~ /ExtUtils::MakeMaker version ([\d\._]+)/) {
-                my $eummv = do { local $^W = 0; $1+0; };
-                if ($eummv < 6.2501) {
-                    # thanks to Slaven for digging that out: MM before
-                    # that could be wrong because it could reflect a
-                    # previous release
-                    undef $req;
-                }
-            }
-            my $areq;
-            my $do_replace;
-            while (my($k,$v) = each %{$req||{}}) {
-                if ($v =~ /\d/) {
-                    $areq->{$k} = $v;
-                } elsif ($k =~ /[A-Za-z]/ &&
-                         $v =~ /[A-Za-z]/ &&
-                         $CPAN::META->exists("Module",$v)
-                        ) {
-                    $CPAN::Frontend->mywarn("Suspicious key-value pair in META.yml's ".
-                                            "requires hash: $k => $v; I'll take both ".
-                                            "key and value as a module name\n");
-                    $CPAN::Frontend->mysleep(1);
-                    $areq->{$k} = 0;
-                    $areq->{$v} = 0;
-                    $do_replace++;
-                }
-            }
-            $req = $areq if $do_replace;
-        }
-    }
-    unless ($req || $breq) {
-        my $build_dir;
-        unless ( $build_dir = $self->{build_dir} ) {
-            return;
-        }
-        my $makefile = File::Spec->catfile($build_dir,"Makefile");
-        my $fh;
-        if (-f $makefile
-            and
-            $fh = FileHandle->new("<$makefile\0")) {
-            CPAN->debug("Getting prereq from Makefile") if $CPAN::DEBUG;
-            local($/) = "\n";
-            while (<$fh>) {
-                last if /MakeMaker post_initialize section/;
-                my($p) = m{^[\#]
-                           \s+PREREQ_PM\s+=>\s+(.+)
-                       }x;
-                next unless $p;
-                # warn "Found prereq expr[$p]";
-
-                #  Regexp modified by A.Speer to remember actual version of file
-                #  PREREQ_PM hash key wants, then add to
-                while ( $p =~ m/(?:\s)([\w\:]+)=>(q\[.*?\]|undef),?/g ) {
-                    # In case a prereq is mentioned twice, complain.
-                    if ( defined $req->{$1} ) {
-                        warn "Warning: PREREQ_PM mentions $1 more than once, ".
-                            "last mention wins";
-                    }
-                    my($m,$n) = ($1,$2);
-                    if ($n =~ /^q\[(.*?)\]$/) {
-                        $n = $1;
-                    }
-                    $req->{$m} = $n;
-                }
-                last;
-            }
-        }
-    }
-    unless ($req || $breq) {
-        my $build_dir = $self->{build_dir} or die "Panic: no build_dir?";
-        my $buildfile = File::Spec->catfile($build_dir,"Build");
-        if (-f $buildfile) {
-            CPAN->debug("Found '$buildfile'") if $CPAN::DEBUG;
-            my $build_prereqs = File::Spec->catfile($build_dir,"_build","prereqs");
-            if (-f $build_prereqs) {
-                CPAN->debug("Getting prerequisites from '$build_prereqs'") if $CPAN::DEBUG;
-                my $content = do { local *FH;
-                                   open FH, $build_prereqs
-                                       or $CPAN::Frontend->mydie("Could not open ".
-                                                                 "'$build_prereqs': $!");
-                                   local $/;
-                                   <FH>;
-                               };
-                my $bphash = eval $content;
-                if ($@) {
-                } else {
-                    $req  = $bphash->{requires} || +{};
-                    $breq = $bphash->{build_requires} || +{};
-                }
-            }
-        }
-    }
-    if (-f "Build.PL"
-        && ! -f "Makefile.PL"
-        && ! exists $req->{"Module::Build"}
-        && ! $CPAN::META->has_inst("Module::Build")) {
-        $CPAN::Frontend->mywarn("  Warning: CPAN.pm discovered Module::Build as ".
-                                "undeclared prerequisite.\n".
-                                "  Adding it now as such.\n"
-                               );
-        $CPAN::Frontend->mysleep(5);
-        $req->{"Module::Build"} = 0;
-        delete $self->{writemakefile};
-    }
-    if ($req || $breq) {
-        $self->{prereq_pm_detected}++;
-        return $self->{prereq_pm} = { requires => $req, build_requires => $breq };
-    }
-}
-
-#-> sub CPAN::Distribution::test ;
-sub test {
-    my($self) = @_;
-    if (my $goto = $self->prefs->{goto}) {
-        return $self->goto($goto);
-    }
-    $self->make;
-    return if $self->prefs->{disabled} && ! $self->{force_update};
-    if ($CPAN::Signal) {
-      delete $self->{force_update};
-      return;
-    }
-    # warn "XDEBUG: checking for notest: $self->{notest} $self";
-    if ($self->{notest}) {
-        $CPAN::Frontend->myprint("Skipping test because of notest pragma\n");
-        return 1;
-    }
-
-    my $make = $self->{modulebuild} ? "Build" : "make";
-
-    local $ENV{PERL5LIB} = defined($ENV{PERL5LIB})
-                           ? $ENV{PERL5LIB}
-                           : ($ENV{PERLLIB} || "");
-
-    local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : "";
-    $CPAN::META->set_perl5lib;
-    local $ENV{MAKEFLAGS}; # protect us from outer make calls
-
-    $CPAN::Frontend->myprint("Running $make test\n");
-
-  EXCUSE: {
-        my @e;
-        if ($self->{make} or $self->{later}) {
-            # go ahead
-        } else {
-            push @e,
-                "Make had some problems, won't test";
-        }
-
-        exists $self->{make} and
-            (
-             UNIVERSAL::can($self->{make},"failed") ?
-             $self->{make}->failed :
-             $self->{make} =~ /^NO/
-            ) and push @e, "Can't test without successful make";
-        $self->{badtestcnt} ||= 0;
-        if ($self->{badtestcnt} > 0) {
-            require Data::Dumper;
-            CPAN->debug(sprintf "NOREPEAT[%s]", Data::Dumper::Dumper($self)) if $CPAN::DEBUG;
-            push @e, "Won't repeat unsuccessful test during this command";
-        }
-
-  &n