summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/CPAN.3pm
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/mageia-cauldron/man3pm/CPAN.3pm
parentInitial commit. (diff)
downloadmanpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz
manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/CPAN.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/CPAN.3pm2542
1 files changed, 2542 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/CPAN.3pm b/upstream/mageia-cauldron/man3pm/CPAN.3pm
new file mode 100644
index 00000000..89007d66
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/CPAN.3pm
@@ -0,0 +1,2542 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "CPAN 3pm"
+.TH CPAN 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+CPAN \- query, download and build perl modules from CPAN sites
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+Interactive mode:
+.PP
+.Vb 1
+\& perl \-MCPAN \-e shell
+.Ve
+.PP
+\&\-\-or\-\-
+.PP
+.Vb 1
+\& cpan
+.Ve
+.PP
+Basic commands:
+.PP
+.Vb 1
+\& # Modules:
+\&
+\& cpan> install Acme::Meta # in the shell
+\&
+\& CPAN::Shell\->install("Acme::Meta"); # in perl
+\&
+\& # Distributions:
+\&
+\& cpan> install NWCLARK/Acme\-Meta\-0.02.tar.gz # in the shell
+\&
+\& CPAN::Shell\->
+\& install("NWCLARK/Acme\-Meta\-0.02.tar.gz"); # in perl
+\&
+\& # module objects:
+\&
+\& $mo = CPAN::Shell\->expandany($mod);
+\& $mo = CPAN::Shell\->expand("Module",$mod); # same thing
+\&
+\& # distribution objects:
+\&
+\& $do = CPAN::Shell\->expand("Module",$mod)\->distribution;
+\& $do = CPAN::Shell\->expandany($distro); # same thing
+\& $do = CPAN::Shell\->expand("Distribution",
+\& $distro); # same thing
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+The CPAN module automates or at least simplifies the make and install
+of perl modules and extensions. It includes some primitive searching
+capabilities and knows how to use LWP, HTTP::Tiny, Net::FTP and certain
+external download clients to fetch distributions from the net.
+.PP
+These are fetched from one or more mirrored CPAN (Comprehensive
+Perl Archive Network) sites and unpacked in a dedicated directory.
+.PP
+The CPAN module also supports named and versioned
+\&\fIbundles\fR of modules. Bundles simplify handling of sets of
+related modules. See Bundles below.
+.PP
+The package contains a session manager and a cache manager. The
+session manager keeps track of what has been fetched, built, and
+installed in the current session. The cache manager keeps track of the
+disk space occupied by the make processes and deletes excess space
+using a simple FIFO mechanism.
+.PP
+All methods provided are accessible in a programmer style and in an
+interactive shell style.
+.ie n .SS "CPAN::shell([$prompt, $command]) Starting Interactive Mode"
+.el .SS "CPAN::shell([$prompt, \f(CW$command\fP]) Starting Interactive Mode"
+.IX Subsection "CPAN::shell([$prompt, $command]) Starting Interactive Mode"
+Enter interactive mode by running
+.PP
+.Vb 1
+\& perl \-MCPAN \-e shell
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\& cpan
+.Ve
+.PP
+which puts you into a readline interface. If \f(CW\*(C`Term::ReadKey\*(C'\fR and
+either of \f(CW\*(C`Term::ReadLine::Perl\*(C'\fR or \f(CW\*(C`Term::ReadLine::Gnu\*(C'\fR are installed,
+history and command completion are supported.
+.PP
+Once at the command line, type \f(CW\*(C`h\*(C'\fR for one-page help
+screen; the rest should be self-explanatory.
+.PP
+The function call \f(CW\*(C`shell\*(C'\fR takes two optional arguments: one the
+prompt, the second the default initial command line (the latter
+only works if a real ReadLine interface module is installed).
+.PP
+The most common uses of the interactive modes are
+.IP "Searching for authors, bundles, distribution files and modules" 2
+.IX Item "Searching for authors, bundles, distribution files and modules"
+There are corresponding one-letter commands \f(CW\*(C`a\*(C'\fR, \f(CW\*(C`b\*(C'\fR, \f(CW\*(C`d\*(C'\fR, and \f(CW\*(C`m\*(C'\fR
+for each of the four categories and another, \f(CW\*(C`i\*(C'\fR for any of the
+mentioned four. Each of the four entities is implemented as a class
+with slightly differing methods for displaying an object.
+.Sp
+Arguments to these commands are either strings exactly matching
+the identification string of an object, or regular expressions
+matched case-insensitively against various attributes of the
+objects. The parser only recognizes a regular expression when you
+enclose it with slashes.
+.Sp
+The principle is that the number of objects found influences how an
+item is displayed. If the search finds one item, the result is
+displayed with the rather verbose method \f(CW\*(C`as_string\*(C'\fR, but if
+more than one is found, each object is displayed with the terse method
+\&\f(CW\*(C`as_glimpse\*(C'\fR.
+.Sp
+Examples:
+.Sp
+.Vb 10
+\& cpan> m Acme::MetaSyntactic
+\& Module id = Acme::MetaSyntactic
+\& CPAN_USERID BOOK (Philippe Bruhat (BooK) <[...]>)
+\& CPAN_VERSION 0.99
+\& CPAN_FILE B/BO/BOOK/Acme\-MetaSyntactic\-0.99.tar.gz
+\& UPLOAD_DATE 2006\-11\-06
+\& MANPAGE Acme::MetaSyntactic \- Themed metasyntactic variables names
+\& INST_FILE /usr/local/lib/perl/5.10.0/Acme/MetaSyntactic.pm
+\& INST_VERSION 0.99
+\& cpan> a BOOK
+\& Author id = BOOK
+\& EMAIL [...]
+\& FULLNAME Philippe Bruhat (BooK)
+\& cpan> d BOOK/Acme\-MetaSyntactic\-0.99.tar.gz
+\& Distribution id = B/BO/BOOK/Acme\-MetaSyntactic\-0.99.tar.gz
+\& CPAN_USERID BOOK (Philippe Bruhat (BooK) <[...]>)
+\& CONTAINSMODS Acme::MetaSyntactic Acme::MetaSyntactic::Alias [...]
+\& UPLOAD_DATE 2006\-11\-06
+\& cpan> m /lorem/
+\& Module = Acme::MetaSyntactic::loremipsum (BOOK/Acme\-MetaSyntactic\-0.99.tar.gz)
+\& Module Text::Lorem (ADEOLA/Text\-Lorem\-0.3.tar.gz)
+\& Module Text::Lorem::More (RKRIMEN/Text\-Lorem\-More\-0.12.tar.gz)
+\& Module Text::Lorem::More::Source (RKRIMEN/Text\-Lorem\-More\-0.12.tar.gz)
+\& cpan> i /berlin/
+\& Distribution BEATNIK/Filter\-NumberLines\-0.02.tar.gz
+\& Module = DateTime::TimeZone::Europe::Berlin (DROLSKY/DateTime\-TimeZone\-0.7904.tar.gz)
+\& Module Filter::NumberLines (BEATNIK/Filter\-NumberLines\-0.02.tar.gz)
+\& Author [...]
+.Ve
+.Sp
+The examples illustrate several aspects: the first three queries
+target modules, authors, or distros directly and yield exactly one
+result. The last two use regular expressions and yield several
+results. The last one targets all of bundles, modules, authors, and
+distros simultaneously. When more than one result is available, they
+are printed in one-line format.
+.ie n .IP """get"", ""make"", ""test"", ""install"", ""clean"" modules or distributions" 2
+.el .IP "\f(CWget\fR, \f(CWmake\fR, \f(CWtest\fR, \f(CWinstall\fR, \f(CWclean\fR modules or distributions" 2
+.IX Item "get, make, test, install, clean modules or distributions"
+These commands take any number of arguments and investigate what is
+necessary to perform the action. Argument processing is as follows:
+.Sp
+.Vb 5
+\& known module name in format Foo/Bar.pm module
+\& other embedded slash distribution
+\& \- with trailing slash dot directory
+\& enclosing slashes regexp
+\& known module name in format Foo::Bar module
+.Ve
+.Sp
+If the argument is a distribution file name (recognized by embedded
+slashes), it is processed. If it is a module, CPAN determines the
+distribution file in which this module is included and processes that,
+following any dependencies named in the module's META.yml or
+Makefile.PL (this behavior is controlled by the configuration
+parameter \f(CW\*(C`prerequisites_policy\*(C'\fR). If an argument is enclosed in
+slashes it is treated as a regular expression: it is expanded and if
+the result is a single object (distribution, bundle or module), this
+object is processed.
+.Sp
+Example:
+.Sp
+.Vb 3
+\& install Dummy::Perl # installs the module
+\& install AUXXX/Dummy\-Perl\-3.14.tar.gz # installs that distribution
+\& install /Dummy\-Perl\-3.14/ # same if the regexp is unambiguous
+.Ve
+.Sp
+\&\f(CW\*(C`get\*(C'\fR downloads a distribution file and untars or unzips it, \f(CW\*(C`make\*(C'\fR
+builds it, \f(CW\*(C`test\*(C'\fR runs the test suite, and \f(CW\*(C`install\*(C'\fR installs it.
+.Sp
+Any \f(CW\*(C`make\*(C'\fR or \f(CW\*(C`test\*(C'\fR is run unconditionally. An
+.Sp
+.Vb 1
+\& install <distribution_file>
+.Ve
+.Sp
+is also run unconditionally. But for
+.Sp
+.Vb 1
+\& install <module>
+.Ve
+.Sp
+CPAN checks whether an install is needed and prints
+\&\fImodule up to date\fR if the distribution file containing
+the module doesn't need updating.
+.Sp
+CPAN also keeps track of what it has done within the current session
+and doesn't try to build a package a second time regardless of whether it
+succeeded or not. It does not repeat a test run if the test
+has been run successfully before. Same for install runs.
+.Sp
+The \f(CW\*(C`force\*(C'\fR pragma may precede another command (currently: \f(CW\*(C`get\*(C'\fR,
+\&\f(CW\*(C`make\*(C'\fR, \f(CW\*(C`test\*(C'\fR, or \f(CW\*(C`install\*(C'\fR) to execute the command from scratch
+and attempt to continue past certain errors. See the section below on
+the \f(CW\*(C`force\*(C'\fR and the \f(CW\*(C`fforce\*(C'\fR pragma.
+.Sp
+The \f(CW\*(C`notest\*(C'\fR pragma skips the test part in the build
+process.
+.Sp
+Example:
+.Sp
+.Vb 1
+\& cpan> notest install Tk
+.Ve
+.Sp
+A \f(CW\*(C`clean\*(C'\fR command results in a
+.Sp
+.Vb 1
+\& make clean
+.Ve
+.Sp
+being executed within the distribution file's working directory.
+.ie n .IP """readme"", ""perldoc"", ""look"" module or distribution" 2
+.el .IP "\f(CWreadme\fR, \f(CWperldoc\fR, \f(CWlook\fR module or distribution" 2
+.IX Item "readme, perldoc, look module or distribution"
+\&\f(CW\*(C`readme\*(C'\fR displays the README file of the associated distribution.
+\&\f(CW\*(C`Look\*(C'\fR gets and untars (if not yet done) the distribution file,
+changes to the appropriate directory and opens a subshell process in
+that directory. \f(CW\*(C`perldoc\*(C'\fR displays the module's pod documentation
+in html or plain text format.
+.ie n .IP """ls"" author" 2
+.el .IP "\f(CWls\fR author" 2
+.IX Item "ls author"
+.PD 0
+.ie n .IP """ls"" globbing_expression" 2
+.el .IP "\f(CWls\fR globbing_expression" 2
+.IX Item "ls globbing_expression"
+.PD
+The first form lists all distribution files in and below an author's
+CPAN directory as stored in the CHECKSUMS files distributed on
+CPAN. The listing recurses into subdirectories.
+.Sp
+The second form limits or expands the output with shell
+globbing as in the following examples:
+.Sp
+.Vb 3
+\& ls JV/make*
+\& ls GSAR/*make*
+\& ls */*make*
+.Ve
+.Sp
+The last example is very slow and outputs extra progress indicators
+that break the alignment of the result.
+.Sp
+Note that globbing only lists directories explicitly asked for, for
+example FOO/* will not list FOO/bar/Acme\-Sthg\-n.nn.tar.gz. This may be
+regarded as a bug that may be changed in some future version.
+.ie n .IP """failed""" 2
+.el .IP \f(CWfailed\fR 2
+.IX Item "failed"
+The \f(CW\*(C`failed\*(C'\fR command reports all distributions that failed on one of
+\&\f(CW\*(C`make\*(C'\fR, \f(CW\*(C`test\*(C'\fR or \f(CW\*(C`install\*(C'\fR for some reason in the currently
+running shell session.
+.IP "Persistence between sessions" 2
+.IX Item "Persistence between sessions"
+If the \f(CW\*(C`YAML\*(C'\fR or the \f(CW\*(C`YAML::Syck\*(C'\fR module is installed a record of
+the internal state of all modules is written to disk after each step.
+The files contain a signature of the currently running perl version
+for later perusal.
+.Sp
+If the configurations variable \f(CW\*(C`build_dir_reuse\*(C'\fR is set to a true
+value, then CPAN.pm reads the collected YAML files. If the stored
+signature matches the currently running perl, the stored state is
+loaded into memory such that persistence between sessions
+is effectively established.
+.ie n .IP "The ""force"" and the ""fforce"" pragma" 2
+.el .IP "The \f(CWforce\fR and the \f(CWfforce\fR pragma" 2
+.IX Item "The force and the fforce pragma"
+To speed things up in complex installation scenarios, CPAN.pm keeps
+track of what it has already done and refuses to do some things a
+second time. A \f(CW\*(C`get\*(C'\fR, a \f(CW\*(C`make\*(C'\fR, and an \f(CW\*(C`install\*(C'\fR are not repeated.
+A \f(CW\*(C`test\*(C'\fR is repeated only if the previous test was unsuccessful. The
+diagnostic message when CPAN.pm refuses to do something a second time
+is one of \fIHas already been \fR\f(CW\*(C`unwrapped|made|tested successfully\*(C'\fR or
+something similar. Another situation where CPAN refuses to act is an
+\&\f(CW\*(C`install\*(C'\fR if the corresponding \f(CW\*(C`test\*(C'\fR was not successful.
+.Sp
+In all these cases, the user can override this stubborn behaviour by
+prepending the command with the word force, for example:
+.Sp
+.Vb 4
+\& cpan> force get Foo
+\& cpan> force make AUTHOR/Bar\-3.14.tar.gz
+\& cpan> force test Baz
+\& cpan> force install Acme::Meta
+.Ve
+.Sp
+Each \fIforced\fR command is executed with the corresponding part of its
+memory erased.
+.Sp
+The \f(CW\*(C`fforce\*(C'\fR pragma is a variant that emulates a \f(CW\*(C`force get\*(C'\fR which
+erases the entire memory followed by the action specified, effectively
+restarting the whole get/make/test/install procedure from scratch.
+.IP Lockfile 2
+.IX Item "Lockfile"
+Interactive sessions maintain a lockfile, by default \f(CW\*(C`~/.cpan/.lock\*(C'\fR.
+Batch jobs can run without a lockfile and not disturb each other.
+.Sp
+The shell offers to run in \fIdowngraded mode\fR when another process is
+holding the lockfile. This is an experimental feature that is not yet
+tested very well. This second shell then does not write the history
+file, does not use the metadata file, and has a different prompt.
+.IP Signals 2
+.IX Item "Signals"
+CPAN.pm installs signal handlers for SIGINT and SIGTERM. While you are
+in the cpan-shell, it is intended that you can press \f(CW\*(C`^C\*(C'\fR anytime and
+return to the cpan-shell prompt. A SIGTERM will cause the cpan-shell
+to clean up and leave the shell loop. You can emulate the effect of a
+SIGTERM by sending two consecutive SIGINTs, which usually means by
+pressing \f(CW\*(C`^C\*(C'\fR twice.
+.Sp
+CPAN.pm ignores SIGPIPE. If the user sets \f(CW\*(C`inactivity_timeout\*(C'\fR, a
+SIGALRM is used during the run of the \f(CW\*(C`perl Makefile.PL\*(C'\fR or \f(CW\*(C`perl
+Build.PL\*(C'\fR subprocess. A SIGALRM is also used during module version
+parsing, and is controlled by \f(CW\*(C`version_timeout\*(C'\fR.
+.SS CPAN::Shell
+.IX Subsection "CPAN::Shell"
+The commands available in the shell interface are methods in
+the package CPAN::Shell. If you enter the shell command, your
+input is split by the \fBText::ParseWords::shellwords()\fR routine, which
+acts like most shells do. The first word is interpreted as the
+method to be invoked, and the rest of the words are treated as the method's arguments.
+Continuation lines are supported by ending a line with a
+literal backslash.
+.SS autobundle
+.IX Subsection "autobundle"
+\&\f(CW\*(C`autobundle\*(C'\fR writes a bundle file into the
+\&\f(CW\*(C`$CPAN::Config\->{cpan_home}/Bundle\*(C'\fR directory. The file contains
+a list of all modules that are both available from CPAN and currently
+installed within \f(CW@INC\fR. Duplicates of each distribution are suppressed.
+The name of the bundle file is based on the current date and a
+counter, e.g. \fIBundle/Snapshot_2012_05_21_00.pm\fR. This is installed
+again by running \f(CW\*(C`cpan Bundle::Snapshot_2012_05_21_00\*(C'\fR, or installing
+\&\f(CW\*(C`Bundle::Snapshot_2012_05_21_00\*(C'\fR from the CPAN shell.
+.PP
+Return value: path to the written file.
+.SS hosts
+.IX Subsection "hosts"
+Note: this feature is still in alpha state and may change in future
+versions of CPAN.pm
+.PP
+This commands provides a statistical overview over recent download
+activities. The data for this is collected in the YAML file
+\&\f(CW\*(C`FTPstats.yml\*(C'\fR in your \f(CW\*(C`cpan_home\*(C'\fR directory. If no YAML module is
+configured or YAML not installed, no stats are provided.
+.IP install_tested 4
+.IX Item "install_tested"
+Install all distributions that have been tested successfully but have
+not yet been installed. See also \f(CW\*(C`is_tested\*(C'\fR.
+.IP is_tested 4
+.IX Item "is_tested"
+List all build directories of distributions that have been tested
+successfully but have not yet been installed. See also
+\&\f(CW\*(C`install_tested\*(C'\fR.
+.SS mkmyconfig
+.IX Subsection "mkmyconfig"
+\&\fBmkmyconfig()\fR writes your own CPAN::MyConfig file into your \f(CW\*(C`~/.cpan/\*(C'\fR
+directory so that you can save your own preferences instead of the
+system-wide ones.
+.SS "r [Module|/Regexp/]..."
+.IX Subsection "r [Module|/Regexp/]..."
+scans current perl installation for modules that have a newer version
+available on CPAN and provides a list of them. If called without
+argument, all potential upgrades are listed; if called with arguments
+the list is filtered to the modules and regexps given as arguments.
+.PP
+The listing looks something like this:
+.PP
+.Vb 10
+\& Package namespace installed latest in CPAN file
+\& CPAN 1.94_64 1.9600 ANDK/CPAN\-1.9600.tar.gz
+\& CPAN::Reporter 1.1801 1.1902 DAGOLDEN/CPAN\-Reporter\-1.1902.tar.gz
+\& YAML 0.70 0.73 INGY/YAML\-0.73.tar.gz
+\& YAML::Syck 1.14 1.17 AVAR/YAML\-Syck\-1.17.tar.gz
+\& YAML::Tiny 1.44 1.50 ADAMK/YAML\-Tiny\-1.50.tar.gz
+\& CGI 3.43 3.55 MARKSTOS/CGI.pm\-3.55.tar.gz
+\& Module::Build::YAML 1.40 1.41 DAGOLDEN/Module\-Build\-0.3800.tar.gz
+\& TAP::Parser::Result::YAML 3.22 3.23 ANDYA/Test\-Harness\-3.23.tar.gz
+\& YAML::XS 0.34 0.35 INGY/YAML\-LibYAML\-0.35.tar.gz
+.Ve
+.PP
+It suppresses duplicates in the column \f(CW\*(C`in CPAN file\*(C'\fR such that
+distributions with many upgradeable modules are listed only once.
+.PP
+Note that the list is not sorted.
+.SS "recent ***EXPERIMENTAL COMMAND***"
+.IX Subsection "recent ***EXPERIMENTAL COMMAND***"
+The \f(CW\*(C`recent\*(C'\fR command downloads a list of recent uploads to CPAN and
+displays them \fIslowly\fR. While the command is running, a \f(CW$SIG\fR{INT}
+exits the loop after displaying the current item.
+.PP
+\&\fBNote\fR: This command requires XML::LibXML installed.
+.PP
+\&\fBNote\fR: This whole command currently is just a hack and will
+probably change in future versions of CPAN.pm, but the general
+approach will likely remain.
+.PP
+\&\fBNote\fR: See also smoke
+.SS recompile
+.IX Subsection "recompile"
+\&\fBrecompile()\fR is a special command that takes no argument and
+runs the make/test/install cycle with brute force over all installed
+dynamically loadable extensions (a.k.a. XS modules) with 'force' in
+effect. The primary purpose of this command is to finish a network
+installation. Imagine you have a common source tree for two different
+architectures. You decide to do a completely independent fresh
+installation. You start on one architecture with the help of a Bundle
+file produced earlier. CPAN installs the whole Bundle for you, but
+when you try to repeat the job on the second architecture, CPAN
+responds with a \f(CW"Foo up to date"\fR message for all modules. So you
+invoke CPAN's recompile on the second architecture and you're done.
+.PP
+Another popular use for \f(CW\*(C`recompile\*(C'\fR is to act as a rescue in case your
+perl breaks binary compatibility. If one of the modules that CPAN uses
+is in turn depending on binary compatibility (so you cannot run CPAN
+commands), then you should try the CPAN::Nox module for recovery.
+.SS "report Bundle|Distribution|Module"
+.IX Subsection "report Bundle|Distribution|Module"
+The \f(CW\*(C`report\*(C'\fR command temporarily turns on the \f(CW\*(C`test_report\*(C'\fR config
+variable, then runs the \f(CW\*(C`force test\*(C'\fR command with the given
+arguments. The \f(CW\*(C`force\*(C'\fR pragma reruns the tests and repeats
+every step that might have failed before.
+.SS "smoke ***EXPERIMENTAL COMMAND***"
+.IX Subsection "smoke ***EXPERIMENTAL COMMAND***"
+\&\fB*** WARNING: this command downloads and executes software from CPAN to
+your computer of completely unknown status. You should never do
+this with your normal account and better have a dedicated well
+separated and secured machine to do this. ***\fR
+.PP
+The \f(CW\*(C`smoke\*(C'\fR command takes the list of recent uploads to CPAN as
+provided by the \f(CW\*(C`recent\*(C'\fR command and tests them all. While the
+command is running \f(CW$SIG\fR{INT} is defined to mean that the current item
+shall be skipped.
+.PP
+\&\fBNote\fR: This whole command currently is just a hack and will
+probably change in future versions of CPAN.pm, but the general
+approach will likely remain.
+.PP
+\&\fBNote\fR: See also recent
+.SS "upgrade [Module|/Regexp/]..."
+.IX Subsection "upgrade [Module|/Regexp/]..."
+The \f(CW\*(C`upgrade\*(C'\fR command first runs an \f(CW\*(C`r\*(C'\fR command with the given
+arguments and then installs the newest versions of all modules that
+were listed by that.
+.ie n .SS "The four ""CPAN::*"" Classes: Author, Bundle, Module, Distribution"
+.el .SS "The four \f(CWCPAN::*\fP Classes: Author, Bundle, Module, Distribution"
+.IX Subsection "The four CPAN::* Classes: Author, Bundle, Module, Distribution"
+Although it may be considered internal, the class hierarchy does matter
+for both users and programmer. CPAN.pm deals with the four
+classes mentioned above, and those classes all share a set of methods. Classical
+single polymorphism is in effect. A metaclass object registers all
+objects of all kinds and indexes them with a string. The strings
+referencing objects have a separated namespace (well, not completely
+separated):
+.PP
+.Vb 1
+\& Namespace Class
+\&
+\& words containing a "/" (slash) Distribution
+\& words starting with Bundle:: Bundle
+\& everything else Module or Author
+.Ve
+.PP
+Modules know their associated Distribution objects. They always refer
+to the most recent official release. Developers may mark their releases
+as unstable development versions (by inserting an underscore into the
+module version number which will also be reflected in the distribution
+name when you run 'make dist'), so the really hottest and newest
+distribution is not always the default. If a module Foo circulates
+on CPAN in both version 1.23 and 1.23_90, CPAN.pm offers a convenient
+way to install version 1.23 by saying
+.PP
+.Vb 1
+\& install Foo
+.Ve
+.PP
+This would install the complete distribution file (say
+BAR/Foo\-1.23.tar.gz) with all accompanying material. But if you would
+like to install version 1.23_90, you need to know where the
+distribution file resides on CPAN relative to the authors/id/
+directory. If the author is BAR, this might be BAR/Foo\-1.23_90.tar.gz;
+so you would have to say
+.PP
+.Vb 1
+\& install BAR/Foo\-1.23_90.tar.gz
+.Ve
+.PP
+The first example will be driven by an object of the class
+CPAN::Module, the second by an object of class CPAN::Distribution.
+.SS "Integrating local directories"
+.IX Subsection "Integrating local directories"
+Note: this feature is still in alpha state and may change in future
+versions of CPAN.pm
+.PP
+Distribution objects are normally distributions from the CPAN, but
+there is a slightly degenerate case for Distribution objects, too, of
+projects held on the local disk. These distribution objects have the
+same name as the local directory and end with a dot. A dot by itself
+is also allowed for the current directory at the time CPAN.pm was
+used. All actions such as \f(CW\*(C`make\*(C'\fR, \f(CW\*(C`test\*(C'\fR, and \f(CW\*(C`install\*(C'\fR are applied
+directly to that directory. This gives the command \f(CW\*(C`cpan .\*(C'\fR an
+interesting touch: while the normal mantra of installing a CPAN module
+without CPAN.pm is one of
+.PP
+.Vb 5
+\& perl Makefile.PL perl Build.PL
+\& ( go and get prerequisites )
+\& make ./Build
+\& make test ./Build test
+\& make install ./Build install
+.Ve
+.PP
+the command \f(CW\*(C`cpan .\*(C'\fR does all of this at once. It figures out which
+of the two mantras is appropriate, fetches and installs all
+prerequisites, takes care of them recursively, and finally finishes the
+installation of the module in the current directory, be it a CPAN
+module or not.
+.PP
+The typical usage case is for private modules or working copies of
+projects from remote repositories on the local disk.
+.SS Redirection
+.IX Subsection "Redirection"
+The usual shell redirection symbols \f(CW\*(C` | \*(C'\fR and \f(CW\*(C`>\*(C'\fR are recognized
+by the cpan shell \fBonly when surrounded by whitespace\fR. So piping to
+pager or redirecting output into a file works somewhat as in a normal
+shell, with the stipulation that you must type extra spaces.
+.SS "Plugin support ***EXPERIMENTAL***"
+.IX Subsection "Plugin support ***EXPERIMENTAL***"
+Plugins are objects that implement any of currently eight methods:
+.PP
+.Vb 8
+\& pre_get
+\& post_get
+\& pre_make
+\& post_make
+\& pre_test
+\& post_test
+\& pre_install
+\& post_install
+.Ve
+.PP
+The \f(CW\*(C`plugin_list\*(C'\fR configuration parameter holds a list of strings of
+the form
+.PP
+.Vb 1
+\& Modulename=arg0,arg1,arg2,arg3,...
+.Ve
+.PP
+eg:
+.PP
+.Vb 1
+\& CPAN::Plugin::Flurb=dir,/opt/pkgs/flurb/raw,verbose,1
+.Ve
+.PP
+At run time, each listed plugin is instantiated as a singleton object
+by running the equivalent of this pseudo code:
+.PP
+.Vb 3
+\& my $plugin = <string representation from config>;
+\& <generate Modulename and arguments from $plugin>;
+\& my $p = $instance{$plugin} ||= Modulename\->new($arg0,$arg1,...);
+.Ve
+.PP
+The generated singletons are kept around from instantiation until the
+end of the shell session. <plugin_list> can be reconfigured at any
+time at run time. While the cpan shell is running, it checks all
+activated plugins at each of the 8 reference points listed above and
+runs the respective method if it is implemented for that object. The
+method is called with the active CPAN::Distribution object passed in
+as an argument.
+.SH CONFIGURATION
+.IX Header "CONFIGURATION"
+When the CPAN module is used for the first time, a configuration
+dialogue tries to determine a couple of site specific options. The
+result of the dialog is stored in a hash reference \f(CW $CPAN::Config \fR
+in a file CPAN/Config.pm.
+.PP
+Default values defined in the CPAN/Config.pm file can be
+overridden in a user specific file: CPAN/MyConfig.pm. Such a file is
+best placed in \f(CW\*(C`$HOME/.cpan/CPAN/MyConfig.pm\*(C'\fR, because \f(CW\*(C`$HOME/.cpan\*(C'\fR is
+added to the search path of the CPAN module before the \fBuse()\fR or
+\&\fBrequire()\fR statements. The mkmyconfig command writes this file for you.
+.PP
+The \f(CW\*(C`o conf\*(C'\fR command has various bells and whistles:
+.IP "completion support" 4
+.IX Item "completion support"
+If you have a ReadLine module installed, you can hit TAB at any point
+of the commandline and \f(CW\*(C`o conf\*(C'\fR will offer you completion for the
+built-in subcommands and/or config variable names.
+.IP "displaying some help: o conf help" 4
+.IX Item "displaying some help: o conf help"
+Displays a short help
+.IP "displaying current values: o conf [KEY]" 4
+.IX Item "displaying current values: o conf [KEY]"
+Displays the current value(s) for this config variable. Without KEY,
+displays all subcommands and config variables.
+.Sp
+Example:
+.Sp
+.Vb 1
+\& o conf shell
+.Ve
+.Sp
+If KEY starts and ends with a slash, the string in between is
+treated as a regular expression and only keys matching this regexp
+are displayed
+.Sp
+Example:
+.Sp
+.Vb 1
+\& o conf /color/
+.Ve
+.IP "changing of scalar values: o conf KEY VALUE" 4
+.IX Item "changing of scalar values: o conf KEY VALUE"
+Sets the config variable KEY to VALUE. The empty string can be
+specified as usual in shells, with \f(CW\*(Aq\*(Aq\fR or \f(CW""\fR
+.Sp
+Example:
+.Sp
+.Vb 1
+\& o conf wget /usr/bin/wget
+.Ve
+.IP "changing of list values: o conf KEY SHIFT|UNSHIFT|PUSH|POP|SPLICE|LIST" 4
+.IX Item "changing of list values: o conf KEY SHIFT|UNSHIFT|PUSH|POP|SPLICE|LIST"
+If a config variable name ends with \f(CW\*(C`list\*(C'\fR, it is a list. \f(CW\*(C`o conf
+KEY shift\*(C'\fR removes the first element of the list, \f(CW\*(C`o conf KEY pop\*(C'\fR
+removes the last element of the list. \f(CW\*(C`o conf KEYS unshift LIST\*(C'\fR
+prepends a list of values to the list, \f(CW\*(C`o conf KEYS push LIST\*(C'\fR
+appends a list of valued to the list.
+.Sp
+Likewise, \f(CW\*(C`o conf KEY splice LIST\*(C'\fR passes the LIST to the corresponding
+splice command.
+.Sp
+Finally, any other list of arguments is taken as a new list value for
+the KEY variable discarding the previous value.
+.Sp
+Examples:
+.Sp
+.Vb 3
+\& o conf urllist unshift http://cpan.dev.local/CPAN
+\& o conf urllist splice 3 1
+\& o conf urllist http://cpan1.local http://cpan2.local ftp://ftp.perl.org
+.Ve
+.IP "reverting to saved: o conf defaults" 4
+.IX Item "reverting to saved: o conf defaults"
+Reverts all config variables to the state in the saved config file.
+.IP "saving the config: o conf commit" 4
+.IX Item "saving the config: o conf commit"
+Saves all config variables to the current config file (CPAN/Config.pm
+or CPAN/MyConfig.pm that was loaded at start).
+.PP
+The configuration dialog can be started any time later again by
+issuing the command \f(CW\*(C` o conf init \*(C'\fR in the CPAN shell. A subset of
+the configuration dialog can be run by issuing \f(CW\*(C`o conf init WORD\*(C'\fR
+where WORD is any valid config variable or a regular expression.
+.SS "Config Variables"
+.IX Subsection "Config Variables"
+The following keys in the hash reference \f(CW$CPAN::Config\fR are
+currently defined:
+.PP
+.Vb 10
+\& allow_installing_module_downgrades
+\& allow or disallow installing module downgrades
+\& allow_installing_outdated_dists
+\& allow or disallow installing modules that are
+\& indexed in the cpan index pointing to a distro
+\& with a higher distro\-version number
+\& applypatch path to external prg
+\& auto_commit commit all changes to config variables to disk
+\& build_cache size of cache for directories to build modules
+\& build_dir locally accessible directory to build modules
+\& build_dir_reuse boolean if distros in build_dir are persistent
+\& build_requires_install_policy
+\& to install or not to install when a module is
+\& only needed for building. yes|no|ask/yes|ask/no
+\& bzip2 path to external prg
+\& cache_metadata use serializer to cache metadata
+\& check_sigs if signatures should be verified
+\& cleanup_after_install
+\& remove build directory immediately after a
+\& successful install and remember that for the
+\& duration of the session
+\& colorize_debug Term::ANSIColor attributes for debugging output
+\& colorize_output boolean if Term::ANSIColor should colorize output
+\& colorize_print Term::ANSIColor attributes for normal output
+\& colorize_warn Term::ANSIColor attributes for warnings
+\& commandnumber_in_prompt
+\& boolean if you want to see current command number
+\& commands_quote preferred character to use for quoting external
+\& commands when running them. Defaults to double
+\& quote on Windows, single tick everywhere else;
+\& can be set to space to disable quoting
+\& connect_to_internet_ok
+\& whether to ask if opening a connection is ok before
+\& urllist is specified
+\& cpan_home local directory reserved for this package
+\& curl path to external prg
+\& dontload_hash DEPRECATED
+\& dontload_list arrayref: modules in the list will not be
+\& loaded by the CPAN::has_inst() routine
+\& ftp path to external prg
+\& ftp_passive if set, the environment variable FTP_PASSIVE is set
+\& for downloads
+\& ftp_proxy proxy host for ftp requests
+\& ftpstats_period max number of days to keep download statistics
+\& ftpstats_size max number of items to keep in the download statistics
+\& getcwd see below
+\& gpg path to external prg
+\& gzip location of external program gzip
+\& halt_on_failure stop processing after the first failure of queued
+\& items or dependencies
+\& histfile file to maintain history between sessions
+\& histsize maximum number of lines to keep in histfile
+\& http_proxy proxy host for http requests
+\& inactivity_timeout breaks interactive Makefile.PLs or Build.PLs
+\& after this many seconds inactivity. Set to 0 to
+\& disable timeouts.
+\& index_expire refetch index files after this many days
+\& inhibit_startup_message
+\& if true, suppress the startup message
+\& keep_source_where directory in which to keep the source (if we do)
+\& load_module_verbosity
+\& report loading of optional modules used by CPAN.pm
+\& lynx path to external prg
+\& make location of external make program
+\& make_arg arguments that should always be passed to \*(Aqmake\*(Aq
+\& make_install_make_command
+\& the make command for running \*(Aqmake install\*(Aq, for
+\& example \*(Aqsudo make\*(Aq
+\& make_install_arg same as make_arg for \*(Aqmake install\*(Aq
+\& makepl_arg arguments passed to \*(Aqperl Makefile.PL\*(Aq
+\& mbuild_arg arguments passed to \*(Aq./Build\*(Aq
+\& mbuild_install_arg arguments passed to \*(Aq./Build install\*(Aq
+\& mbuild_install_build_command
+\& command to use instead of \*(Aq./Build\*(Aq when we are
+\& in the install stage, for example \*(Aqsudo ./Build\*(Aq
+\& mbuildpl_arg arguments passed to \*(Aqperl Build.PL\*(Aq
+\& ncftp path to external prg
+\& ncftpget path to external prg
+\& no_proxy don\*(Aqt proxy to these hosts/domains (comma separated list)
+\& pager location of external program more (or any pager)
+\& password your password if you CPAN server wants one
+\& patch path to external prg
+\& patches_dir local directory containing patch files
+\& perl5lib_verbosity verbosity level for PERL5LIB additions
+\& plugin_list list of active hooks (see Plugin support above
+\& and the CPAN::Plugin module)
+\& prefer_external_tar
+\& per default all untar operations are done with
+\& Archive::Tar; by setting this variable to true
+\& the external tar command is used if available
+\& prefer_installer legal values are MB and EUMM: if a module comes
+\& with both a Makefile.PL and a Build.PL, use the
+\& former (EUMM) or the latter (MB); if the module
+\& comes with only one of the two, that one will be
+\& used no matter the setting
+\& prerequisites_policy
+\& what to do if you are missing module prerequisites
+\& (\*(Aqfollow\*(Aq automatically, \*(Aqask\*(Aq me, or \*(Aqignore\*(Aq)
+\& For \*(Aqfollow\*(Aq, also sets PERL_AUTOINSTALL and
+\& PERL_EXTUTILS_AUTOINSTALL for "\-\-defaultdeps" if
+\& not already set
+\& prefs_dir local directory to store per\-distro build options
+\& proxy_user username for accessing an authenticating proxy
+\& proxy_pass password for accessing an authenticating proxy
+\& pushy_https use https to cpan.org when possible, otherwise use http
+\& to cpan.org and issue a warning
+\& randomize_urllist add some randomness to the sequence of the urllist
+\& recommends_policy whether recommended prerequisites should be included
+\& scan_cache controls scanning of cache (\*(Aqatstart\*(Aq, \*(Aqatexit\*(Aq or \*(Aqnever\*(Aq)
+\& shell your favorite shell
+\& show_unparsable_versions
+\& boolean if r command tells which modules are versionless
+\& show_upload_date boolean if commands should try to determine upload date
+\& show_zero_versions boolean if r command tells for which modules $version==0
+\& suggests_policy whether suggested prerequisites should be included
+\& tar location of external program tar
+\& tar_verbosity verbosity level for the tar command
+\& term_is_latin deprecated: if true Unicode is translated to ISO\-8859\-1
+\& (and nonsense for characters outside latin range)
+\& term_ornaments boolean to turn ReadLine ornamenting on/off
+\& test_report email test reports (if CPAN::Reporter is installed)
+\& trust_test_report_history
+\& skip testing when previously tested ok (according to
+\& CPAN::Reporter history)
+\& unzip location of external program unzip
+\& urllist arrayref to nearby CPAN sites (or equivalent locations)
+\& urllist_ping_external
+\& use external ping command when autoselecting mirrors
+\& urllist_ping_verbose
+\& increase verbosity when autoselecting mirrors
+\& use_prompt_default set PERL_MM_USE_DEFAULT for configure/make/test/install
+\& use_sqlite use CPAN::SQLite for metadata storage (fast and lean)
+\& username your username if you CPAN server wants one
+\& version_timeout stops version parsing after this many seconds.
+\& Default is 15 secs. Set to 0 to disable.
+\& wait_list arrayref to a wait server to try (See CPAN::WAIT)
+\& wget path to external prg
+\& yaml_load_code enable YAML code deserialisation via CPAN::DeferredCode
+\& yaml_module which module to use to read/write YAML files
+.Ve
+.PP
+You can set and query each of these options interactively in the cpan
+shell with the \f(CW\*(C`o conf\*(C'\fR or the \f(CW\*(C`o conf init\*(C'\fR command as specified below.
+.ie n .IP """o conf <scalar option>""" 2
+.el .IP "\f(CWo conf <scalar option>\fR" 2
+.IX Item "o conf <scalar option>"
+prints the current value of the \fIscalar option\fR
+.ie n .IP """o conf <scalar option> <value>""" 2
+.el .IP "\f(CWo conf <scalar option> <value>\fR" 2
+.IX Item "o conf <scalar option> <value>"
+Sets the value of the \fIscalar option\fR to \fIvalue\fR
+.ie n .IP """o conf <list option>""" 2
+.el .IP "\f(CWo conf <list option>\fR" 2
+.IX Item "o conf <list option>"
+prints the current value of the \fIlist option\fR in MakeMaker's
+neatvalue format.
+.ie n .IP """o conf <list option> [shift|pop]""" 2
+.el .IP "\f(CWo conf <list option> [shift|pop]\fR" 2
+.IX Item "o conf <list option> [shift|pop]"
+shifts or pops the array in the \fIlist option\fR variable
+.ie n .IP """o conf <list option> [unshift|push|splice] <list>""" 2
+.el .IP "\f(CWo conf <list option> [unshift|push|splice] <list>\fR" 2
+.IX Item "o conf <list option> [unshift|push|splice] <list>"
+works like the corresponding perl commands.
+.IP "interactive editing: o conf init [MATCH|LIST]" 2
+.IX Item "interactive editing: o conf init [MATCH|LIST]"
+Runs an interactive configuration dialog for matching variables.
+Without argument runs the dialog over all supported config variables.
+To specify a MATCH the argument must be enclosed by slashes.
+.Sp
+Examples:
+.Sp
+.Vb 2
+\& o conf init ftp_passive ftp_proxy
+\& o conf init /color/
+.Ve
+.Sp
+Note: this method of setting config variables often provides more
+explanation about the functioning of a variable than the manpage.
+.SS "CPAN::anycwd($path): Note on config variable getcwd"
+.IX Subsection "CPAN::anycwd($path): Note on config variable getcwd"
+CPAN.pm changes the current working directory often and needs to
+determine its own current working directory. By default it uses
+Cwd::cwd, but if for some reason this doesn't work on your system,
+configure alternatives according to the following table:
+.IP cwd 4
+.IX Item "cwd"
+Calls Cwd::cwd
+.IP getcwd 4
+.IX Item "getcwd"
+Calls Cwd::getcwd
+.IP fastcwd 4
+.IX Item "fastcwd"
+Calls Cwd::fastcwd
+.IP getdcwd 4
+.IX Item "getdcwd"
+Calls Cwd::getdcwd
+.IP backtickcwd 4
+.IX Item "backtickcwd"
+Calls the external command cwd.
+.SS "Note on the format of the urllist parameter"
+.IX Subsection "Note on the format of the urllist parameter"
+urllist parameters are URLs according to RFC 1738. We do a little
+guessing if your URL is not compliant, but if you have problems with
+\&\f(CW\*(C`file\*(C'\fR URLs, please try the correct format. Either:
+.PP
+.Vb 1
+\& file://localhost/whatever/ftp/pub/CPAN/
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\& file:///home/ftp/pub/CPAN/
+.Ve
+.SS "The urllist parameter has CD-ROM support"
+.IX Subsection "The urllist parameter has CD-ROM support"
+The \f(CW\*(C`urllist\*(C'\fR parameter of the configuration table contains a list of
+URLs used for downloading. If the list contains any
+\&\f(CW\*(C`file\*(C'\fR URLs, CPAN always tries there first. This
+feature is disabled for index files. So the recommendation for the
+owner of a CD-ROM with CPAN contents is: include your local, possibly
+outdated CD-ROM as a \f(CW\*(C`file\*(C'\fR URL at the end of urllist, e.g.
+.PP
+.Vb 1
+\& o conf urllist push file://localhost/CDROM/CPAN
+.Ve
+.PP
+CPAN.pm will then fetch the index files from one of the CPAN sites
+that come at the beginning of urllist. It will later check for each
+module to see whether there is a local copy of the most recent version.
+.PP
+Another peculiarity of urllist is that the site that we could
+successfully fetch the last file from automatically gets a preference
+token and is tried as the first site for the next request. So if you
+add a new site at runtime it may happen that the previously preferred
+site will be tried another time. This means that if you want to disallow
+a site for the next transfer, it must be explicitly removed from
+urllist.
+.SS "Maintaining the urllist parameter"
+.IX Subsection "Maintaining the urllist parameter"
+If you have YAML.pm (or some other YAML module configured in
+\&\f(CW\*(C`yaml_module\*(C'\fR) installed, CPAN.pm collects a few statistical data
+about recent downloads. You can view the statistics with the \f(CW\*(C`hosts\*(C'\fR
+command or inspect them directly by looking into the \f(CW\*(C`FTPstats.yml\*(C'\fR
+file in your \f(CW\*(C`cpan_home\*(C'\fR directory.
+.PP
+To get some interesting statistics, it is recommended that
+\&\f(CW\*(C`randomize_urllist\*(C'\fR be set; this introduces some amount of
+randomness into the URL selection.
+.ie n .SS "The ""requires"" and ""build_requires"" dependency declarations"
+.el .SS "The \f(CWrequires\fP and \f(CWbuild_requires\fP dependency declarations"
+.IX Subsection "The requires and build_requires dependency declarations"
+Since CPAN.pm version 1.88_51 modules declared as \f(CW\*(C`build_requires\*(C'\fR by
+a distribution are treated differently depending on the config
+variable \f(CW\*(C`build_requires_install_policy\*(C'\fR. By setting
+\&\f(CW\*(C`build_requires_install_policy\*(C'\fR to \f(CW\*(C`no\*(C'\fR, such a module is not
+installed. It is only built and tested, and then kept in the list of
+tested but uninstalled modules. As such, it is available during the
+build of the dependent module by integrating the path to the
+\&\f(CW\*(C`blib/arch\*(C'\fR and \f(CW\*(C`blib/lib\*(C'\fR directories in the environment variable
+PERL5LIB. If \f(CW\*(C`build_requires_install_policy\*(C'\fR is set to \f(CW\*(C`yes\*(C'\fR, then
+both modules declared as \f(CW\*(C`requires\*(C'\fR and those declared as
+\&\f(CW\*(C`build_requires\*(C'\fR are treated alike. By setting to \f(CW\*(C`ask/yes\*(C'\fR or
+\&\f(CW\*(C`ask/no\*(C'\fR, CPAN.pm asks the user and sets the default accordingly.
+.SS "Configuration of the allow_installing_* parameters"
+.IX Subsection "Configuration of the allow_installing_* parameters"
+The \f(CW\*(C`allow_installing_*\*(C'\fR parameters are evaluated during
+the \f(CW\*(C`make\*(C'\fR phase. If set to \f(CW\*(C`yes\*(C'\fR, they allow the testing and the installation of
+the current distro and otherwise have no effect. If set to \f(CW\*(C`no\*(C'\fR, they
+may abort the build (preventing testing and installing), depending on the contents of the
+\&\f(CW\*(C`blib/\*(C'\fR directory. The \f(CW\*(C`blib/\*(C'\fR directory is the directory that holds
+all the files that would usually be installed in the \f(CW\*(C`install\*(C'\fR phase.
+.PP
+\&\f(CW\*(C`allow_installing_outdated_dists\*(C'\fR compares the \f(CW\*(C`blib/\*(C'\fR directory with the CPAN index.
+If it finds something there that belongs, according to the index, to a different
+dist, it aborts the current build.
+.PP
+\&\f(CW\*(C`allow_installing_module_downgrades\*(C'\fR compares the \f(CW\*(C`blib/\*(C'\fR directory
+with already installed modules, actually their version numbers, as
+determined by ExtUtils::MakeMaker or equivalent. If a to-be-installed
+module would downgrade an already installed module, the current build
+is aborted.
+.PP
+An interesting twist occurs when a distroprefs document demands the
+installation of an outdated dist via goto while
+\&\f(CW\*(C`allow_installing_outdated_dists\*(C'\fR forbids it. Without additional
+provisions, this would let the \f(CW\*(C`allow_installing_outdated_dists\*(C'\fR
+win and the distroprefs lose. So the proper arrangement in such a case
+is to write a second distroprefs document for the distro that \f(CW\*(C`goto\*(C'\fR
+points to and overrule the \f(CW\*(C`cpanconfig\*(C'\fR there. E.g.:
+.PP
+.Vb 9
+\& \-\-\-
+\& match:
+\& distribution: "^MAUKE/Keyword\-Simple\-0.04.tar.gz"
+\& goto: "MAUKE/Keyword\-Simple\-0.03.tar.gz"
+\& \-\-\-
+\& match:
+\& distribution: "^MAUKE/Keyword\-Simple\-0.03.tar.gz"
+\& cpanconfig:
+\& allow_installing_outdated_dists: yes
+.Ve
+.SS "Configuration for individual distributions (\fIDistroprefs\fP)"
+.IX Subsection "Configuration for individual distributions (Distroprefs)"
+(\fBNote:\fR This feature has been introduced in CPAN.pm 1.8854)
+.PP
+Distributions on CPAN usually behave according to what we call the
+CPAN mantra. Or since the advent of Module::Build we should talk about
+two mantras:
+.PP
+.Vb 4
+\& perl Makefile.PL perl Build.PL
+\& make ./Build
+\& make test ./Build test
+\& make install ./Build install
+.Ve
+.PP
+But some modules cannot be built with this mantra. They try to get
+some extra data from the user via the environment, extra arguments, or
+interactively\-\-thus disturbing the installation of large bundles like
+Phalanx100 or modules with many dependencies like Plagger.
+.PP
+The distroprefs system of \f(CW\*(C`CPAN.pm\*(C'\fR addresses this problem by
+allowing the user to specify extra informations and recipes in YAML
+files to either
+.IP \(bu 4
+pass additional arguments to one of the four commands,
+.IP \(bu 4
+set environment variables
+.IP \(bu 4
+instantiate an Expect object that reads from the console, waits for
+some regular expressions and enters some answers
+.IP \(bu 4
+temporarily override assorted \f(CW\*(C`CPAN.pm\*(C'\fR configuration variables
+.IP \(bu 4
+specify dependencies the original maintainer forgot
+.IP \(bu 4
+disable the installation of an object altogether
+.PP
+See the YAML and Data::Dumper files that come with the \f(CW\*(C`CPAN.pm\*(C'\fR
+distribution in the \f(CW\*(C`distroprefs/\*(C'\fR directory for examples.
+.SS Filenames
+.IX Subsection "Filenames"
+The YAML files themselves must have the \f(CW\*(C`.yml\*(C'\fR extension; all other
+files are ignored (for two exceptions see \fIFallback Data::Dumper and
+Storable\fR below). The containing directory can be specified in
+\&\f(CW\*(C`CPAN.pm\*(C'\fR in the \f(CW\*(C`prefs_dir\*(C'\fR config variable. Try \f(CW\*(C`o conf init
+prefs_dir\*(C'\fR in the CPAN shell to set and activate the distroprefs
+system.
+.PP
+Every YAML file may contain arbitrary documents according to the YAML
+specification, and every document is treated as an entity that
+can specify the treatment of a single distribution.
+.PP
+Filenames can be picked arbitrarily; \f(CW\*(C`CPAN.pm\*(C'\fR always reads
+all files (in alphabetical order) and takes the key \f(CW\*(C`match\*(C'\fR (see
+below in \fILanguage Specs\fR) as a hashref containing match criteria
+that determine if the current distribution matches the YAML document
+or not.
+.SS "Fallback Data::Dumper and Storable"
+.IX Subsection "Fallback Data::Dumper and Storable"
+If neither your configured \f(CW\*(C`yaml_module\*(C'\fR nor YAML.pm is installed,
+CPAN.pm falls back to using Data::Dumper and Storable and looks for
+files with the extensions \f(CW\*(C`.dd\*(C'\fR or \f(CW\*(C`.st\*(C'\fR in the \f(CW\*(C`prefs_dir\*(C'\fR
+directory. These files are expected to contain one or more hashrefs.
+For Data::Dumper generated files, this is expected to be done with by
+defining \f(CW$VAR1\fR, \f(CW$VAR2\fR, etc. The YAML shell would produce these
+with the command
+.PP
+.Vb 1
+\& ysh < somefile.yml > somefile.dd
+.Ve
+.PP
+For Storable files the rule is that they must be constructed such that
+\&\f(CWStorable::retrieve(file)\fR returns an array reference and the array
+elements represent one distropref object each. The conversion from
+YAML would look like so:
+.PP
+.Vb 3
+\& perl \-MYAML=LoadFile \-MStorable=nstore \-e \*(Aq
+\& @y=LoadFile(shift);
+\& nstore(\e@y, shift)\*(Aq somefile.yml somefile.st
+.Ve
+.PP
+In bootstrapping situations it is usually sufficient to translate only
+a few YAML files to Data::Dumper for crucial modules like
+\&\f(CW\*(C`YAML::Syck\*(C'\fR, \f(CW\*(C`YAML.pm\*(C'\fR and \f(CW\*(C`Expect.pm\*(C'\fR. If you prefer Storable
+over Data::Dumper, remember to pull out a Storable version that writes
+an older format than all the other Storable versions that will need to
+read them.
+.SS Blueprint
+.IX Subsection "Blueprint"
+The following example contains all supported keywords and structures
+with the exception of \f(CW\*(C`eexpect\*(C'\fR which can be used instead of
+\&\f(CW\*(C`expect\*(C'\fR.
+.PP
+.Vb 10
+\& \-\-\-
+\& comment: "Demo"
+\& match:
+\& module: "Dancing::Queen"
+\& distribution: "^CHACHACHA/Dancing\-"
+\& not_distribution: "\e.zip$"
+\& perl: "/usr/local/cariba\-perl/bin/perl"
+\& perlconfig:
+\& archname: "freebsd"
+\& not_cc: "gcc"
+\& env:
+\& DANCING_FLOOR: "Shubiduh"
+\& disabled: 1
+\& cpanconfig:
+\& make: gmake
+\& pl:
+\& args:
+\& \- "\-\-somearg=specialcase"
+\&
+\& env: {}
+\&
+\& expect:
+\& \- "Which is your favorite fruit"
+\& \- "apple\en"
+\&
+\& make:
+\& args:
+\& \- all
+\& \- extra\-all
+\&
+\& env: {}
+\&
+\& expect: []
+\&
+\& commandline: "echo SKIPPING make"
+\&
+\& test:
+\& args: []
+\&
+\& env: {}
+\&
+\& expect: []
+\&
+\& install:
+\& args: []
+\&
+\& env:
+\& WANT_TO_INSTALL: YES
+\&
+\& expect:
+\& \- "Do you really want to install"
+\& \- "y\en"
+\&
+\& patches:
+\& \- "ABCDE/Fedcba\-3.14\-ABCDE\-01.patch"
+\&
+\& depends:
+\& configure_requires:
+\& LWP: 5.8
+\& build_requires:
+\& Test::Exception: 0.25
+\& requires:
+\& Spiffy: 0.30
+.Ve
+.SS "Language Specs"
+.IX Subsection "Language Specs"
+Every YAML document represents a single hash reference. The valid keys
+in this hash are as follows:
+.IP "comment [scalar]" 4
+.IX Item "comment [scalar]"
+A comment
+.IP "cpanconfig [hash]" 4
+.IX Item "cpanconfig [hash]"
+Temporarily override assorted \f(CW\*(C`CPAN.pm\*(C'\fR configuration variables.
+.Sp
+Supported are: \f(CW\*(C`build_requires_install_policy\*(C'\fR, \f(CW\*(C`check_sigs\*(C'\fR,
+\&\f(CW\*(C`make\*(C'\fR, \f(CW\*(C`make_install_make_command\*(C'\fR, \f(CW\*(C`prefer_installer\*(C'\fR,
+\&\f(CW\*(C`test_report\*(C'\fR. Please report as a bug when you need another one
+supported.
+.IP "depends [hash] *** EXPERIMENTAL FEATURE ***" 4
+.IX Item "depends [hash] *** EXPERIMENTAL FEATURE ***"
+All three types, namely \f(CW\*(C`configure_requires\*(C'\fR, \f(CW\*(C`build_requires\*(C'\fR, and
+\&\f(CW\*(C`requires\*(C'\fR are supported in the way specified in the META.yml
+specification. The current implementation \fImerges\fR the specified
+dependencies with those declared by the package maintainer. In a
+future implementation this may be changed to override the original
+declaration.
+.IP "disabled [boolean]" 4
+.IX Item "disabled [boolean]"
+Specifies that this distribution shall not be processed at all.
+.IP "features [array] *** EXPERIMENTAL FEATURE ***" 4
+.IX Item "features [array] *** EXPERIMENTAL FEATURE ***"
+Experimental implementation to deal with optional_features from
+META.yml. Still needs coordination with installer software and
+currently works only for META.yml declaring \f(CW\*(C`dynamic_config=0\*(C'\fR. Use
+with caution.
+.IP "goto [string]" 4
+.IX Item "goto [string]"
+The canonical name of a delegate distribution to install
+instead. Useful when a new version, although it tests OK itself,
+breaks something else or a developer release or a fork is already
+uploaded that is better than the last released version.
+.IP "install [hash]" 4
+.IX Item "install [hash]"
+Processing instructions for the \f(CW\*(C`make install\*(C'\fR or \f(CW\*(C`./Build install\*(C'\fR
+phase of the CPAN mantra. See below under \fIProcessing Instructions\fR.
+.IP "make [hash]" 4
+.IX Item "make [hash]"
+Processing instructions for the \f(CW\*(C`make\*(C'\fR or \f(CW\*(C`./Build\*(C'\fR phase of the
+CPAN mantra. See below under \fIProcessing Instructions\fR.
+.IP "match [hash]" 4
+.IX Item "match [hash]"
+A hashref with one or more of the keys \f(CW\*(C`distribution\*(C'\fR, \f(CW\*(C`module\*(C'\fR,
+\&\f(CW\*(C`perl\*(C'\fR, \f(CW\*(C`perlconfig\*(C'\fR, and \f(CW\*(C`env\*(C'\fR that specify whether a document is
+targeted at a specific CPAN distribution or installation.
+Keys prefixed with \f(CW\*(C`not_\*(C'\fR negates the corresponding match.
+.Sp
+The corresponding values are interpreted as regular expressions. The
+\&\f(CW\*(C`distribution\*(C'\fR related one will be matched against the canonical
+distribution name, e.g. "AUTHOR/Foo\-Bar\-3.14.tar.gz".
+.Sp
+The \f(CW\*(C`module\*(C'\fR related one will be matched against \fIall\fR modules
+contained in the distribution until one module matches.
+.Sp
+The \f(CW\*(C`perl\*(C'\fR related one will be matched against \f(CW$^X\fR (but with the
+absolute path).
+.Sp
+The value associated with \f(CW\*(C`perlconfig\*(C'\fR is itself a hashref that is
+matched against corresponding values in the \f(CW%Config::Config\fR hash
+living in the \f(CW\*(C`Config.pm\*(C'\fR module.
+Keys prefixed with \f(CW\*(C`not_\*(C'\fR negates the corresponding match.
+.Sp
+The value associated with \f(CW\*(C`env\*(C'\fR is itself a hashref that is
+matched against corresponding values in the \f(CW%ENV\fR hash.
+Keys prefixed with \f(CW\*(C`not_\*(C'\fR negates the corresponding match.
+.Sp
+If more than one restriction of \f(CW\*(C`module\*(C'\fR, \f(CW\*(C`distribution\*(C'\fR, etc. is
+specified, the results of the separately computed match values must
+all match. If so, the hashref represented by the
+YAML document is returned as the preference structure for the current
+distribution.
+.IP "patches [array]" 4
+.IX Item "patches [array]"
+An array of patches on CPAN or on the local disk to be applied in
+order via an external patch program. If the value for the \f(CW\*(C`\-p\*(C'\fR
+parameter is \f(CW0\fR or \f(CW1\fR is determined by reading the patch
+beforehand. The path to each patch is either an absolute path on the
+local filesystem or relative to a patch directory specified in the
+\&\f(CW\*(C`patches_dir\*(C'\fR configuration variable or in the format of a canonical
+distro name. For examples please consult the distroprefs/ directory in
+the CPAN.pm distribution (these examples are not installed by
+default).
+.Sp
+Note: if the \f(CW\*(C`applypatch\*(C'\fR program is installed and \f(CW\*(C`CPAN::Config\*(C'\fR
+knows about it \fBand\fR a patch is written by the \f(CW\*(C`makepatch\*(C'\fR program,
+then \f(CW\*(C`CPAN.pm\*(C'\fR lets \f(CW\*(C`applypatch\*(C'\fR apply the patch. Both \f(CW\*(C`makepatch\*(C'\fR
+and \f(CW\*(C`applypatch\*(C'\fR are available from CPAN in the \f(CW\*(C`JV/makepatch\-*\*(C'\fR
+distribution.
+.IP "pl [hash]" 4
+.IX Item "pl [hash]"
+Processing instructions for the \f(CW\*(C`perl Makefile.PL\*(C'\fR or \f(CW\*(C`perl
+Build.PL\*(C'\fR phase of the CPAN mantra. See below under \fIProcessing
+Instructions\fR.
+.IP "test [hash]" 4
+.IX Item "test [hash]"
+Processing instructions for the \f(CW\*(C`make test\*(C'\fR or \f(CW\*(C`./Build test\*(C'\fR phase
+of the CPAN mantra. See below under \fIProcessing Instructions\fR.
+.SS "Processing Instructions"
+.IX Subsection "Processing Instructions"
+.IP "args [array]" 4
+.IX Item "args [array]"
+Arguments to be added to the command line
+.IP commandline 4
+.IX Item "commandline"
+A full commandline to run via \f(CWsystem()\fR.
+During execution, the environment variable PERL is set
+to $^X (but with an absolute path). If \f(CW\*(C`commandline\*(C'\fR is specified,
+\&\f(CW\*(C`args\*(C'\fR is not used.
+.IP "eexpect [hash]" 4
+.IX Item "eexpect [hash]"
+Extended \f(CW\*(C`expect\*(C'\fR. This is a hash reference with four allowed keys,
+\&\f(CW\*(C`mode\*(C'\fR, \f(CW\*(C`timeout\*(C'\fR, \f(CW\*(C`reuse\*(C'\fR, and \f(CW\*(C`talk\*(C'\fR.
+.Sp
+You must install the \f(CW\*(C`Expect\*(C'\fR module to use \f(CW\*(C`eexpect\*(C'\fR. CPAN.pm
+does not install it for you.
+.Sp
+\&\f(CW\*(C`mode\*(C'\fR may have the values \f(CW\*(C`deterministic\*(C'\fR for the case where all
+questions come in the order written down and \f(CW\*(C`anyorder\*(C'\fR for the case
+where the questions may come in any order. The default mode is
+\&\f(CW\*(C`deterministic\*(C'\fR.
+.Sp
+\&\f(CW\*(C`timeout\*(C'\fR denotes a timeout in seconds. Floating-point timeouts are
+OK. With \f(CW\*(C`mode=deterministic\*(C'\fR, the timeout denotes the
+timeout per question; with \f(CW\*(C`mode=anyorder\*(C'\fR it denotes the
+timeout per byte received from the stream or questions.
+.Sp
+\&\f(CW\*(C`talk\*(C'\fR is a reference to an array that contains alternating questions
+and answers. Questions are regular expressions and answers are literal
+strings. The Expect module watches the stream from the
+execution of the external program (\f(CW\*(C`perl Makefile.PL\*(C'\fR, \f(CW\*(C`perl
+Build.PL\*(C'\fR, \f(CW\*(C`make\*(C'\fR, etc.).
+.Sp
+For \f(CW\*(C`mode=deterministic\*(C'\fR, the CPAN.pm injects the
+corresponding answer as soon as the stream matches the regular expression.
+.Sp
+For \f(CW\*(C`mode=anyorder\*(C'\fR CPAN.pm answers a question as soon
+as the timeout is reached for the next byte in the input stream. In
+this mode you can use the \f(CW\*(C`reuse\*(C'\fR parameter to decide what will
+happen with a question-answer pair after it has been used. In the
+default case (reuse=0) it is removed from the array, avoiding being
+used again accidentally. If you want to answer the
+question \f(CW\*(C`Do you really want to do that\*(C'\fR several times, then it must
+be included in the array at least as often as you want this answer to
+be given. Setting the parameter \f(CW\*(C`reuse\*(C'\fR to 1 makes this repetition
+unnecessary.
+.IP "env [hash]" 4
+.IX Item "env [hash]"
+Environment variables to be set during the command
+.IP "expect [array]" 4
+.IX Item "expect [array]"
+You must install the \f(CW\*(C`Expect\*(C'\fR module to use \f(CW\*(C`expect\*(C'\fR. CPAN.pm
+does not install it for you.
+.Sp
+\&\f(CW\*(C`expect: <array>\*(C'\fR is a short notation for this \f(CW\*(C`eexpect\*(C'\fR:
+.Sp
+.Vb 4
+\& eexpect:
+\& mode: deterministic
+\& timeout: 15
+\& talk: <array>
+.Ve
+.ie n .SS "Schema verification with ""Kwalify"""
+.el .SS "Schema verification with \f(CWKwalify\fP"
+.IX Subsection "Schema verification with Kwalify"
+If you have the \f(CW\*(C`Kwalify\*(C'\fR module installed (which is part of the
+Bundle::CPANxxl), then all your distroprefs files are checked for
+syntactic correctness.
+.SS "Example Distroprefs Files"
+.IX Subsection "Example Distroprefs Files"
+\&\f(CW\*(C`CPAN.pm\*(C'\fR comes with a collection of example YAML files. Note that these
+are really just examples and should not be used without care because
+they cannot fit everybody's purpose. After all, the authors of the
+packages that ask questions had a need to ask, so you should watch
+their questions and adjust the examples to your environment and your
+needs. You have been warned:\-)
+.SH "PROGRAMMER'S INTERFACE"
+.IX Header "PROGRAMMER'S INTERFACE"
+If you do not enter the shell, shell commands are
+available both as methods (\f(CW\*(C`CPAN::Shell\->install(...)\*(C'\fR) and as
+functions in the calling package (\f(CWinstall(...)\fR). Before calling low-level
+commands, it makes sense to initialize components of CPAN you need, e.g.:
+.PP
+.Vb 3
+\& CPAN::HandleConfig\->load;
+\& CPAN::Shell::setup_output;
+\& CPAN::Index\->reload;
+.Ve
+.PP
+High-level commands do such initializations automatically.
+.PP
+There's currently only one class that has a stable interface \-
+CPAN::Shell. All commands that are available in the CPAN shell are
+methods of the class CPAN::Shell. The arguments on the commandline are
+passed as arguments to the method.
+.PP
+So if you take for example the shell command
+.PP
+.Vb 1
+\& notest install A B C
+.Ve
+.PP
+the actually executed command is
+.PP
+.Vb 1
+\& CPAN::Shell\->notest("install","A","B","C");
+.Ve
+.PP
+Each of the commands that produce listings of modules (\f(CW\*(C`r\*(C'\fR,
+\&\f(CW\*(C`autobundle\*(C'\fR, \f(CW\*(C`u\*(C'\fR) also return a list of the IDs of all modules
+within the list.
+.IP expand($type,@things) 2
+.IX Item "expand($type,@things)"
+The IDs of all objects available within a program are strings that can
+be expanded to the corresponding real objects with the
+\&\f(CW\*(C`CPAN::Shell\->expand("Module",@things)\*(C'\fR method. Expand returns a
+list of CPAN::Module objects according to the \f(CW@things\fR arguments
+given. In scalar context, it returns only the first element of the
+list.
+.IP expandany(@things) 2
+.IX Item "expandany(@things)"
+Like expand, but returns objects of the appropriate type, i.e.
+CPAN::Bundle objects for bundles, CPAN::Module objects for modules, and
+CPAN::Distribution objects for distributions. Note: it does not expand
+to CPAN::Author objects.
+.IP "Programming Examples" 2
+.IX Item "Programming Examples"
+This enables the programmer to do operations that combine
+functionalities that are available in the shell.
+.Sp
+.Vb 2
+\& # install everything that is outdated on my disk:
+\& perl \-MCPAN \-e \*(AqCPAN::Shell\->install(CPAN::Shell\->r)\*(Aq
+\&
+\& # install my favorite programs if necessary:
+\& for $mod (qw(Net::FTP Digest::SHA Data::Dumper)) {
+\& CPAN::Shell\->install($mod);
+\& }
+\&
+\& # list all modules on my disk that have no VERSION number
+\& for $mod (CPAN::Shell\->expand("Module","/./")) {
+\& next unless $mod\->inst_file;
+\& # MakeMaker convention for undefined $VERSION:
+\& next unless $mod\->inst_version eq "undef";
+\& print "No VERSION in ", $mod\->id, "\en";
+\& }
+\&
+\& # find out which distribution on CPAN contains a module:
+\& print CPAN::Shell\->expand("Module","Apache::Constants")\->cpan_file
+.Ve
+.Sp
+Or if you want to schedule a \fIcron\fR job to watch CPAN, you could list
+all modules that need updating. First a quick and dirty way:
+.Sp
+.Vb 1
+\& perl \-e \*(Aquse CPAN; CPAN::Shell\->r;\*(Aq
+.Ve
+.Sp
+If you don't want any output should all modules be
+up to date, parse the output of above command for the regular
+expression \f(CW\*(C`/modules are up to date/\*(C'\fR and decide to mail the output
+only if it doesn't match.
+.Sp
+If you prefer to do it more in a programmerish style in one single
+process, something like this may better suit you:
+.Sp
+.Vb 7
+\& # list all modules on my disk that have newer versions on CPAN
+\& for $mod (CPAN::Shell\->expand("Module","/./")) {
+\& next unless $mod\->inst_file;
+\& next if $mod\->uptodate;
+\& printf "Module %s is installed as %s, could be updated to %s from CPAN\en",
+\& $mod\->id, $mod\->inst_version, $mod\->cpan_version;
+\& }
+.Ve
+.Sp
+If that gives too much output every day, you may want to
+watch only for three modules. You can write
+.Sp
+.Vb 1
+\& for $mod (CPAN::Shell\->expand("Module","/Apache|LWP|CGI/")) {
+.Ve
+.Sp
+as the first line instead. Or you can combine some of the above
+tricks:
+.Sp
+.Vb 5
+\& # watch only for a new mod_perl module
+\& $mod = CPAN::Shell\->expand("Module","mod_perl");
+\& exit if $mod\->uptodate;
+\& # new mod_perl arrived, let me know all update recommendations
+\& CPAN::Shell\->r;
+.Ve
+.SS "Methods in the other Classes"
+.IX Subsection "Methods in the other Classes"
+.IP \fBCPAN::Author::as_glimpse()\fR 4
+.IX Item "CPAN::Author::as_glimpse()"
+Returns a one-line description of the author
+.IP \fBCPAN::Author::as_string()\fR 4
+.IX Item "CPAN::Author::as_string()"
+Returns a multi-line description of the author
+.IP \fBCPAN::Author::email()\fR 4
+.IX Item "CPAN::Author::email()"
+Returns the author's email address
+.IP \fBCPAN::Author::fullname()\fR 4
+.IX Item "CPAN::Author::fullname()"
+Returns the author's name
+.IP \fBCPAN::Author::name()\fR 4
+.IX Item "CPAN::Author::name()"
+An alias for fullname
+.IP \fBCPAN::Bundle::as_glimpse()\fR 4
+.IX Item "CPAN::Bundle::as_glimpse()"
+Returns a one-line description of the bundle
+.IP \fBCPAN::Bundle::as_string()\fR 4
+.IX Item "CPAN::Bundle::as_string()"
+Returns a multi-line description of the bundle
+.IP \fBCPAN::Bundle::clean()\fR 4
+.IX Item "CPAN::Bundle::clean()"
+Recursively runs the \f(CW\*(C`clean\*(C'\fR method on all items contained in the bundle.
+.IP \fBCPAN::Bundle::contains()\fR 4
+.IX Item "CPAN::Bundle::contains()"
+Returns a list of objects' IDs contained in a bundle. The associated
+objects may be bundles, modules or distributions.
+.IP CPAN::Bundle::force($method,@args) 4
+.IX Item "CPAN::Bundle::force($method,@args)"
+Forces CPAN to perform a task that it normally would have refused to
+do. Force takes as arguments a method name to be called and any number
+of additional arguments that should be passed to the called method.
+The internals of the object get the needed changes so that CPAN.pm
+does not refuse to take the action. The \f(CW\*(C`force\*(C'\fR is passed recursively
+to all contained objects. See also the section above on the \f(CW\*(C`force\*(C'\fR
+and the \f(CW\*(C`fforce\*(C'\fR pragma.
+.IP \fBCPAN::Bundle::get()\fR 4
+.IX Item "CPAN::Bundle::get()"
+Recursively runs the \f(CW\*(C`get\*(C'\fR method on all items contained in the bundle
+.IP \fBCPAN::Bundle::inst_file()\fR 4
+.IX Item "CPAN::Bundle::inst_file()"
+Returns the highest installed version of the bundle in either \f(CW@INC\fR or
+\&\f(CW\*(C`$CPAN::Config\->{cpan_home}\*(C'\fR. Note that this is different from
+CPAN::Module::inst_file.
+.IP \fBCPAN::Bundle::inst_version()\fR 4
+.IX Item "CPAN::Bundle::inst_version()"
+Like CPAN::Bundle::inst_file, but returns the \f(CW$VERSION\fR
+.IP \fBCPAN::Bundle::uptodate()\fR 4
+.IX Item "CPAN::Bundle::uptodate()"
+Returns 1 if the bundle itself and all its members are up-to-date.
+.IP \fBCPAN::Bundle::install()\fR 4
+.IX Item "CPAN::Bundle::install()"
+Recursively runs the \f(CW\*(C`install\*(C'\fR method on all items contained in the bundle
+.IP \fBCPAN::Bundle::make()\fR 4
+.IX Item "CPAN::Bundle::make()"
+Recursively runs the \f(CW\*(C`make\*(C'\fR method on all items contained in the bundle
+.IP \fBCPAN::Bundle::readme()\fR 4
+.IX Item "CPAN::Bundle::readme()"
+Recursively runs the \f(CW\*(C`readme\*(C'\fR method on all items contained in the bundle
+.IP \fBCPAN::Bundle::test()\fR 4
+.IX Item "CPAN::Bundle::test()"
+Recursively runs the \f(CW\*(C`test\*(C'\fR method on all items contained in the bundle
+.IP \fBCPAN::Distribution::as_glimpse()\fR 4
+.IX Item "CPAN::Distribution::as_glimpse()"
+Returns a one-line description of the distribution
+.IP \fBCPAN::Distribution::as_string()\fR 4
+.IX Item "CPAN::Distribution::as_string()"
+Returns a multi-line description of the distribution
+.IP CPAN::Distribution::author 4
+.IX Item "CPAN::Distribution::author"
+Returns the CPAN::Author object of the maintainer who uploaded this
+distribution
+.IP \fBCPAN::Distribution::pretty_id()\fR 4
+.IX Item "CPAN::Distribution::pretty_id()"
+Returns a string of the form "AUTHORID/TARBALL", where AUTHORID is the
+author's PAUSE ID and TARBALL is the distribution filename.
+.IP \fBCPAN::Distribution::base_id()\fR 4
+.IX Item "CPAN::Distribution::base_id()"
+Returns the distribution filename without any archive suffix. E.g
+"Foo\-Bar\-0.01"
+.IP \fBCPAN::Distribution::clean()\fR 4
+.IX Item "CPAN::Distribution::clean()"
+Changes to the directory where the distribution has been unpacked and
+runs \f(CW\*(C`make clean\*(C'\fR there.
+.IP \fBCPAN::Distribution::containsmods()\fR 4
+.IX Item "CPAN::Distribution::containsmods()"
+Returns a list of IDs of modules contained in a distribution file.
+Works only for distributions listed in the 02packages.details.txt.gz
+file. This typically means that just most recent version of a
+distribution is covered.
+.IP \fBCPAN::Distribution::cvs_import()\fR 4
+.IX Item "CPAN::Distribution::cvs_import()"
+Changes to the directory where the distribution has been unpacked and
+runs something like
+.Sp
+.Vb 1
+\& cvs \-d $cvs_root import \-m $cvs_log $cvs_dir $userid v$version
+.Ve
+.Sp
+there.
+.IP \fBCPAN::Distribution::dir()\fR 4
+.IX Item "CPAN::Distribution::dir()"
+Returns the directory into which this distribution has been unpacked.
+.IP CPAN::Distribution::force($method,@args) 4
+.IX Item "CPAN::Distribution::force($method,@args)"
+Forces CPAN to perform a task that it normally would have refused to
+do. Force takes as arguments a method name to be called and any number
+of additional arguments that should be passed to the called method.
+The internals of the object get the needed changes so that CPAN.pm
+does not refuse to take the action. See also the section above on the
+\&\f(CW\*(C`force\*(C'\fR and the \f(CW\*(C`fforce\*(C'\fR pragma.
+.IP \fBCPAN::Distribution::get()\fR 4
+.IX Item "CPAN::Distribution::get()"
+Downloads the distribution from CPAN and unpacks it. Does nothing if
+the distribution has already been downloaded and unpacked within the
+current session.
+.IP \fBCPAN::Distribution::install()\fR 4
+.IX Item "CPAN::Distribution::install()"
+Changes to the directory where the distribution has been unpacked and
+runs the external command \f(CW\*(C`make install\*(C'\fR there. If \f(CW\*(C`make\*(C'\fR has not
+yet been run, it will be run first. A \f(CW\*(C`make test\*(C'\fR is issued in
+any case and if this fails, the install is cancelled. The
+cancellation can be avoided by letting \f(CW\*(C`force\*(C'\fR run the \f(CW\*(C`install\*(C'\fR for
+you.
+.Sp
+This install method only has the power to install the distribution if
+there are no dependencies in the way. To install an object along with all
+its dependencies, use CPAN::Shell\->install.
+.Sp
+Note that \fBinstall()\fR gives no meaningful return value. See \fBuptodate()\fR.
+.IP \fBCPAN::Distribution::isa_perl()\fR 4
+.IX Item "CPAN::Distribution::isa_perl()"
+Returns 1 if this distribution file seems to be a perl distribution.
+Normally this is derived from the file name only, but the index from
+CPAN can contain a hint to achieve a return value of true for other
+filenames too.
+.IP \fBCPAN::Distribution::look()\fR 4
+.IX Item "CPAN::Distribution::look()"
+Changes to the directory where the distribution has been unpacked and
+opens a subshell there. Exiting the subshell returns.
+.IP \fBCPAN::Distribution::make()\fR 4
+.IX Item "CPAN::Distribution::make()"
+First runs the \f(CW\*(C`get\*(C'\fR method to make sure the distribution is
+downloaded and unpacked. Changes to the directory where the
+distribution has been unpacked and runs the external commands \f(CW\*(C`perl
+Makefile.PL\*(C'\fR or \f(CW\*(C`perl Build.PL\*(C'\fR and \f(CW\*(C`make\*(C'\fR there.
+.IP \fBCPAN::Distribution::perldoc()\fR 4
+.IX Item "CPAN::Distribution::perldoc()"
+Downloads the pod documentation of the file associated with a
+distribution (in HTML format) and runs it through the external
+command \fIlynx\fR specified in \f(CW\*(C`$CPAN::Config\->{lynx}\*(C'\fR. If \fIlynx\fR
+isn't available, it converts it to plain text with the external
+command \fIhtml2text\fR and runs it through the pager specified
+in \f(CW\*(C`$CPAN::Config\->{pager}\*(C'\fR.
+.IP \fBCPAN::Distribution::prefs()\fR 4
+.IX Item "CPAN::Distribution::prefs()"
+Returns the hash reference from the first matching YAML file that the
+user has deposited in the \f(CW\*(C`prefs_dir/\*(C'\fR directory. The first
+succeeding match wins. The files in the \f(CW\*(C`prefs_dir/\*(C'\fR are processed
+alphabetically, and the canonical distro name (e.g.
+AUTHOR/Foo\-Bar\-3.14.tar.gz) is matched against the regular expressions
+stored in the \f(CW$root\fR\->{match}{distribution} attribute value.
+Additionally all module names contained in a distribution are matched
+against the regular expressions in the \f(CW$root\fR\->{match}{module} attribute
+value. The two match values are ANDed together. Each of the two
+attributes are optional.
+.IP \fBCPAN::Distribution::prereq_pm()\fR 4
+.IX Item "CPAN::Distribution::prereq_pm()"
+Returns the hash reference that has been announced by a distribution
+as the \f(CW\*(C`requires\*(C'\fR and \f(CW\*(C`build_requires\*(C'\fR elements. These can be
+declared either by the \f(CW\*(C`META.yml\*(C'\fR (if authoritative) or can be
+deposited after the run of \f(CW\*(C`Build.PL\*(C'\fR in the file \f(CW\*(C`./_build/prereqs\*(C'\fR
+or after the run of \f(CW\*(C`Makfile.PL\*(C'\fR written as the \f(CW\*(C`PREREQ_PM\*(C'\fR hash in
+a comment in the produced \f(CW\*(C`Makefile\*(C'\fR. \fINote\fR: this method only works
+after an attempt has been made to \f(CW\*(C`make\*(C'\fR the distribution. Returns
+undef otherwise.
+.IP \fBCPAN::Distribution::readme()\fR 4
+.IX Item "CPAN::Distribution::readme()"
+Downloads the README file associated with a distribution and runs it
+through the pager specified in \f(CW\*(C`$CPAN::Config\->{pager}\*(C'\fR.
+.IP \fBCPAN::Distribution::reports()\fR 4
+.IX Item "CPAN::Distribution::reports()"
+Downloads report data for this distribution from www.cpantesters.org
+and displays a subset of them.
+.IP \fBCPAN::Distribution::read_yaml()\fR 4
+.IX Item "CPAN::Distribution::read_yaml()"
+Returns the content of the META.yml of this distro as a hashref. Note:
+works only after an attempt has been made to \f(CW\*(C`make\*(C'\fR the distribution.
+Returns undef otherwise. Also returns undef if the content of META.yml
+is not authoritative. (The rules about what exactly makes the content
+authoritative are still in flux.)
+.IP \fBCPAN::Distribution::test()\fR 4
+.IX Item "CPAN::Distribution::test()"
+Changes to the directory where the distribution has been unpacked and
+runs \f(CW\*(C`make test\*(C'\fR there.
+.IP \fBCPAN::Distribution::uptodate()\fR 4
+.IX Item "CPAN::Distribution::uptodate()"
+Returns 1 if all the modules contained in the distribution are
+up-to-date. Relies on containsmods.
+.IP \fBCPAN::Index::force_reload()\fR 4
+.IX Item "CPAN::Index::force_reload()"
+Forces a reload of all indices.
+.IP \fBCPAN::Index::reload()\fR 4
+.IX Item "CPAN::Index::reload()"
+Reloads all indices if they have not been read for more than
+\&\f(CW\*(C`$CPAN::Config\->{index_expire}\*(C'\fR days.
+.IP \fBCPAN::InfoObj::dump()\fR 4
+.IX Item "CPAN::InfoObj::dump()"
+CPAN::Author, CPAN::Bundle, CPAN::Module, and CPAN::Distribution
+inherit this method. It prints the data structure associated with an
+object. Useful for debugging. Note: the data structure is considered
+internal and thus subject to change without notice.
+.IP \fBCPAN::Module::as_glimpse()\fR 4
+.IX Item "CPAN::Module::as_glimpse()"
+Returns a one-line description of the module in four columns: The
+first column contains the word \f(CW\*(C`Module\*(C'\fR, the second column consists
+of one character: an equals sign if this module is already installed
+and up-to-date, a less-than sign if this module is installed but can be
+upgraded, and a space if the module is not installed. The third column
+is the name of the module and the fourth column gives maintainer or
+distribution information.
+.IP \fBCPAN::Module::as_string()\fR 4
+.IX Item "CPAN::Module::as_string()"
+Returns a multi-line description of the module
+.IP \fBCPAN::Module::clean()\fR 4
+.IX Item "CPAN::Module::clean()"
+Runs a clean on the distribution associated with this module.
+.IP \fBCPAN::Module::cpan_file()\fR 4
+.IX Item "CPAN::Module::cpan_file()"
+Returns the filename on CPAN that is associated with the module.
+.IP \fBCPAN::Module::cpan_version()\fR 4
+.IX Item "CPAN::Module::cpan_version()"
+Returns the latest version of this module available on CPAN.
+.IP \fBCPAN::Module::cvs_import()\fR 4
+.IX Item "CPAN::Module::cvs_import()"
+Runs a cvs_import on the distribution associated with this module.
+.IP \fBCPAN::Module::description()\fR 4
+.IX Item "CPAN::Module::description()"
+Returns a 44 character description of this module. Only available for
+modules listed in The Module List (CPAN/modules/00modlist.long.html
+or 00modlist.long.txt.gz)
+.IP \fBCPAN::Module::distribution()\fR 4
+.IX Item "CPAN::Module::distribution()"
+Returns the CPAN::Distribution object that contains the current
+version of this module.
+.IP \fBCPAN::Module::dslip_status()\fR 4
+.IX Item "CPAN::Module::dslip_status()"
+Returns a hash reference. The keys of the hash are the letters \f(CW\*(C`D\*(C'\fR,
+\&\f(CW\*(C`S\*(C'\fR, \f(CW\*(C`L\*(C'\fR, \f(CW\*(C`I\*(C'\fR, and <P>, for development status, support level,
+language, interface and public licence respectively. The data for the
+DSLIP status are collected by pause.perl.org when authors register
+their namespaces. The values of the 5 hash elements are one-character
+words whose meaning is described in the table below. There are also 5
+hash elements \f(CW\*(C`DV\*(C'\fR, \f(CW\*(C`SV\*(C'\fR, \f(CW\*(C`LV\*(C'\fR, \f(CW\*(C`IV\*(C'\fR, and <PV> that carry a more
+verbose value of the 5 status variables.
+.Sp
+Where the 'DSLIP' characters have the following meanings:
+.Sp
+.Vb 7
+\& D \- Development Stage (Note: *NO IMPLIED TIMESCALES*):
+\& i \- Idea, listed to gain consensus or as a placeholder
+\& c \- under construction but pre\-alpha (not yet released)
+\& a/b \- Alpha/Beta testing
+\& R \- Released
+\& M \- Mature (no rigorous definition)
+\& S \- Standard, supplied with Perl 5
+\&
+\& S \- Support Level:
+\& m \- Mailing\-list
+\& d \- Developer
+\& u \- Usenet newsgroup comp.lang.perl.modules
+\& n \- None known, try comp.lang.perl.modules
+\& a \- abandoned; volunteers welcome to take over maintenance
+\&
+\& L \- Language Used:
+\& p \- Perl\-only, no compiler needed, should be platform independent
+\& c \- C and perl, a C compiler will be needed
+\& h \- Hybrid, written in perl with optional C code, no compiler needed
+\& + \- C++ and perl, a C++ compiler will be needed
+\& o \- perl and another language other than C or C++
+\&
+\& I \- Interface Style
+\& f \- plain Functions, no references used
+\& h \- hybrid, object and function interfaces available
+\& n \- no interface at all (huh?)
+\& r \- some use of unblessed References or ties
+\& O \- Object oriented using blessed references and/or inheritance
+\&
+\& P \- Public License
+\& p \- Standard\-Perl: user may choose between GPL and Artistic
+\& g \- GPL: GNU General Public License
+\& l \- LGPL: "GNU Lesser General Public License" (previously known as
+\& "GNU Library General Public License")
+\& b \- BSD: The BSD License
+\& a \- Artistic license alone
+\& 2 \- Artistic license 2.0 or later
+\& o \- open source: approved by www.opensource.org
+\& d \- allows distribution without restrictions
+\& r \- restricted distribution
+\& n \- no license at all
+.Ve
+.IP CPAN::Module::force($method,@args) 4
+.IX Item "CPAN::Module::force($method,@args)"
+Forces CPAN to perform a task it would normally refuse to
+do. Force takes as arguments a method name to be invoked and any number
+of additional arguments to pass that method.
+The internals of the object get the needed changes so that CPAN.pm
+does not refuse to take the action. See also the section above on the
+\&\f(CW\*(C`force\*(C'\fR and the \f(CW\*(C`fforce\*(C'\fR pragma.
+.IP \fBCPAN::Module::get()\fR 4
+.IX Item "CPAN::Module::get()"
+Runs a get on the distribution associated with this module.
+.IP \fBCPAN::Module::inst_file()\fR 4
+.IX Item "CPAN::Module::inst_file()"
+Returns the filename of the module found in \f(CW@INC\fR. The first file found
+is reported, just as perl itself stops searching \f(CW@INC\fR once it finds a
+module.
+.IP \fBCPAN::Module::available_file()\fR 4
+.IX Item "CPAN::Module::available_file()"
+Returns the filename of the module found in PERL5LIB or \f(CW@INC\fR. The
+first file found is reported. The advantage of this method over
+\&\f(CW\*(C`inst_file\*(C'\fR is that modules that have been tested but not yet
+installed are included because PERL5LIB keeps track of tested modules.
+.IP \fBCPAN::Module::inst_version()\fR 4
+.IX Item "CPAN::Module::inst_version()"
+Returns the version number of the installed module in readable format.
+.IP \fBCPAN::Module::available_version()\fR 4
+.IX Item "CPAN::Module::available_version()"
+Returns the version number of the available module in readable format.
+.IP \fBCPAN::Module::install()\fR 4
+.IX Item "CPAN::Module::install()"
+Runs an \f(CW\*(C`install\*(C'\fR on the distribution associated with this module.
+.IP \fBCPAN::Module::look()\fR 4
+.IX Item "CPAN::Module::look()"
+Changes to the directory where the distribution associated with this
+module has been unpacked and opens a subshell there. Exiting the
+subshell returns.
+.IP \fBCPAN::Module::make()\fR 4
+.IX Item "CPAN::Module::make()"
+Runs a \f(CW\*(C`make\*(C'\fR on the distribution associated with this module.
+.IP \fBCPAN::Module::manpage_headline()\fR 4
+.IX Item "CPAN::Module::manpage_headline()"
+If module is installed, peeks into the module's manpage, reads the
+headline, and returns it. Moreover, if the module has been downloaded
+within this session, does the equivalent on the downloaded module even
+if it hasn't been installed yet.
+.IP \fBCPAN::Module::perldoc()\fR 4
+.IX Item "CPAN::Module::perldoc()"
+Runs a \f(CW\*(C`perldoc\*(C'\fR on this module.
+.IP \fBCPAN::Module::readme()\fR 4
+.IX Item "CPAN::Module::readme()"
+Runs a \f(CW\*(C`readme\*(C'\fR on the distribution associated with this module.
+.IP \fBCPAN::Module::reports()\fR 4
+.IX Item "CPAN::Module::reports()"
+Calls the \fBreports()\fR method on the associated distribution object.
+.IP \fBCPAN::Module::test()\fR 4
+.IX Item "CPAN::Module::test()"
+Runs a \f(CW\*(C`test\*(C'\fR on the distribution associated with this module.
+.IP \fBCPAN::Module::uptodate()\fR 4
+.IX Item "CPAN::Module::uptodate()"
+Returns 1 if the module is installed and up-to-date.
+.IP \fBCPAN::Module::userid()\fR 4
+.IX Item "CPAN::Module::userid()"
+Returns the author's ID of the module.
+.SS "Cache Manager"
+.IX Subsection "Cache Manager"
+Currently the cache manager only keeps track of the build directory
+($CPAN::Config\->{build_dir}). It is a simple FIFO mechanism that
+deletes complete directories below \f(CW\*(C`build_dir\*(C'\fR as soon as the size of
+all directories there gets bigger than \f(CW$CPAN::Config\fR\->{build_cache}
+(in MB). The contents of this cache may be used for later
+re-installations that you intend to do manually, but will never be
+trusted by CPAN itself. This is due to the fact that the user might
+use these directories for building modules on different architectures.
+.PP
+There is another directory ($CPAN::Config\->{keep_source_where}) where
+the original distribution files are kept. This directory is not
+covered by the cache manager and must be controlled by the user. If
+you choose to have the same directory as build_dir and as
+keep_source_where directory, then your sources will be deleted with
+the same fifo mechanism.
+.SS Bundles
+.IX Subsection "Bundles"
+A bundle is just a perl module in the namespace Bundle:: that does not
+define any functions or methods. It usually only contains documentation.
+.PP
+It starts like a perl module with a package declaration and a \f(CW$VERSION\fR
+variable. After that the pod section looks like any other pod with the
+only difference being that \fIone special pod section\fR exists starting with
+(verbatim):
+.PP
+.Vb 1
+\& =head1 CONTENTS
+.Ve
+.PP
+In this pod section each line obeys the format
+.PP
+.Vb 1
+\& Module_Name [Version_String] [\- optional text]
+.Ve
+.PP
+The only required part is the first field, the name of a module
+(e.g. Foo::Bar, i.e. \fInot\fR the name of the distribution file). The rest
+of the line is optional. The comment part is delimited by a dash just
+as in the man page header.
+.PP
+The distribution of a bundle should follow the same convention as
+other distributions.
+.PP
+Bundles are treated specially in the CPAN package. If you say 'install
+Bundle::Tkkit' (assuming such a bundle exists), CPAN will install all
+the modules in the CONTENTS section of the pod. You can install your
+own Bundles locally by placing a conformant Bundle file somewhere into
+your \f(CW@INC\fR path. The \fBautobundle()\fR command which is available in the
+shell interface does that for you by including all currently installed
+modules in a snapshot bundle file.
+.SH PREREQUISITES
+.IX Header "PREREQUISITES"
+The CPAN program is trying to depend on as little as possible so the
+user can use it in hostile environment. It works better the more goodies
+the environment provides. For example if you try in the CPAN shell
+.PP
+.Vb 1
+\& install Bundle::CPAN
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\& install Bundle::CPANxxl
+.Ve
+.PP
+you will find the shell more convenient than the bare shell before.
+.PP
+If you have a local mirror of CPAN and can access all files with
+"file:" URLs, then you only need a perl later than perl5.003 to run
+this module. Otherwise Net::FTP is strongly recommended. LWP may be
+required for non-UNIX systems, or if your nearest CPAN site is
+associated with a URL that is not \f(CW\*(C`ftp:\*(C'\fR.
+.PP
+If you have neither Net::FTP nor LWP, there is a fallback mechanism
+implemented for an external ftp command or for an external lynx
+command.
+.SH UTILITIES
+.IX Header "UTILITIES"
+.SS "Finding packages and VERSION"
+.IX Subsection "Finding packages and VERSION"
+This module presumes that all packages on CPAN
+.IP \(bu 2
+declare their \f(CW$VERSION\fR variable in an easy to parse manner. This
+prerequisite can hardly be relaxed because it consumes far too much
+memory to load all packages into the running program just to determine
+the \f(CW$VERSION\fR variable. Currently all programs that are dealing with
+version use something like this
+.Sp
+.Vb 2
+\& perl \-MExtUtils::MakeMaker \-le \e
+\& \*(Aqprint MM\->parse_version(shift)\*(Aq filename
+.Ve
+.Sp
+If you are author of a package and wonder if your \f(CW$VERSION\fR can be
+parsed, please try the above method.
+.IP \(bu 2
+come as compressed or gzipped tarfiles or as zip files and contain a
+\&\f(CW\*(C`Makefile.PL\*(C'\fR or \f(CW\*(C`Build.PL\*(C'\fR (well, we try to handle a bit more, but
+with little enthusiasm).
+.SS Debugging
+.IX Subsection "Debugging"
+Debugging this module is more than a bit complex due to interference from
+the software producing the indices on CPAN, the mirroring process on CPAN,
+packaging, configuration, synchronicity, and even (gasp!) due to bugs
+within the CPAN.pm module itself.
+.PP
+For debugging the code of CPAN.pm itself in interactive mode, some
+debugging aid can be turned on for most packages within
+CPAN.pm with one of
+.IP "o debug package..." 2
+.IX Item "o debug package..."
+sets debug mode for packages.
+.IP "o debug \-package..." 2
+.IX Item "o debug -package..."
+unsets debug mode for packages.
+.IP "o debug all" 2
+.IX Item "o debug all"
+turns debugging on for all packages.
+.IP "o debug number" 2
+.IX Item "o debug number"
+.PP
+which sets the debugging packages directly. Note that \f(CW\*(C`o debug 0\*(C'\fR
+turns debugging off.
+.PP
+What seems a successful strategy is the combination of \f(CW\*(C`reload
+cpan\*(C'\fR and the debugging switches. Add a new debug statement while
+running in the shell and then issue a \f(CW\*(C`reload cpan\*(C'\fR and see the new
+debugging messages immediately without losing the current context.
+.PP
+\&\f(CW\*(C`o debug\*(C'\fR without an argument lists the valid package names and the
+current set of packages in debugging mode. \f(CW\*(C`o debug\*(C'\fR has built-in
+completion support.
+.PP
+For debugging of CPAN data there is the \f(CW\*(C`dump\*(C'\fR command which takes
+the same arguments as make/test/install and outputs each object's
+Data::Dumper dump. If an argument looks like a perl variable and
+contains one of \f(CW\*(C`$\*(C'\fR, \f(CW\*(C`@\*(C'\fR or \f(CW\*(C`%\*(C'\fR, it is \fBeval()\fRed and fed to
+Data::Dumper directly.
+.SS "Floppy, Zip, Offline Mode"
+.IX Subsection "Floppy, Zip, Offline Mode"
+CPAN.pm works nicely without network access, too. If you maintain machines
+that are not networked at all, you should consider working with \f(CW\*(C`file:\*(C'\fR
+URLs. You'll have to collect your modules somewhere first. So
+you might use CPAN.pm to put together all you need on a networked
+machine. Then copy the \f(CW$CPAN::Config\fR\->{keep_source_where} (but not
+\&\f(CW$CPAN::Config\fR\->{build_dir}) directory on a floppy. This floppy is kind
+of a personal CPAN. CPAN.pm on the non-networked machines works nicely
+with this floppy. See also below the paragraph about CD-ROM support.
+.SS "Basic Utilities for Programmers"
+.IX Subsection "Basic Utilities for Programmers"
+.IP has_inst($module) 2
+.IX Item "has_inst($module)"
+Returns true if the module is installed. Used to load all modules into
+the running CPAN.pm that are considered optional. The config variable
+\&\f(CW\*(C`dontload_list\*(C'\fR intercepts the \f(CWhas_inst()\fR call such
+that an optional module is not loaded despite being available. For
+example, the following command will prevent \f(CW\*(C`YAML.pm\*(C'\fR from being
+loaded:
+.Sp
+.Vb 1
+\& cpan> o conf dontload_list push YAML
+.Ve
+.Sp
+See the source for details.
+.IP use_inst($module) 2
+.IX Item "use_inst($module)"
+Similary to \fBhas_inst()\fR tries to load optional library but also dies if
+library is not available
+.IP has_usable($module) 2
+.IX Item "has_usable($module)"
+Returns true if the module is installed and in a usable state. Only
+useful for a handful of modules that are used internally. See the
+source for details.
+.IP instance($module) 2
+.IX Item "instance($module)"
+The constructor for all the singletons used to represent modules,
+distributions, authors, and bundles. If the object already exists, this
+method returns the object; otherwise, it calls the constructor.
+.IP \fBfrontend()\fR 2
+.IX Item "frontend()"
+.PD 0
+.IP frontend($new_frontend) 2
+.IX Item "frontend($new_frontend)"
+.PD
+Getter/setter for frontend object. Method just allows to subclass CPAN.pm.
+.SH SECURITY
+.IX Header "SECURITY"
+There's no strong security layer in CPAN.pm. CPAN.pm helps you to
+install foreign, unmasked, unsigned code on your machine. We compare
+to a checksum that comes from the net just as the distribution file
+itself. But we try to make it easy to add security on demand:
+.SS "Cryptographically signed modules"
+.IX Subsection "Cryptographically signed modules"
+Since release 1.77, CPAN.pm has been able to verify cryptographically
+signed module distributions using Module::Signature. The CPAN modules
+can be signed by their authors, thus giving more security. The simple
+unsigned MD5 checksums that were used before by CPAN protect mainly
+against accidental file corruption.
+.PP
+You will need to have Module::Signature installed, which in turn
+requires that you have at least one of Crypt::OpenPGP module or the
+command-line \fIgpg\fR tool installed.
+.PP
+You will also need to be able to connect over the Internet to the public
+key servers, like pgp.mit.edu, and their port 11731 (the HKP protocol).
+.PP
+The configuration parameter check_sigs is there to turn signature
+checking on or off.
+.SH EXPORT
+.IX Header "EXPORT"
+Most functions in package CPAN are exported by default. The reason
+for this is that the primary use is intended for the cpan shell or for
+one-liners.
+.SH ENVIRONMENT
+.IX Header "ENVIRONMENT"
+When the CPAN shell enters a subshell via the look command, it sets
+the environment CPAN_SHELL_LEVEL to 1, or increments that variable if it is
+already set.
+.PP
+When CPAN runs, it sets the environment variable PERL5_CPAN_IS_RUNNING
+to the ID of the running process. It also sets
+PERL5_CPANPLUS_IS_RUNNING to prevent runaway processes which could
+happen with older versions of Module::Install.
+.PP
+When running \f(CW\*(C`perl Makefile.PL\*(C'\fR, the environment variable
+\&\f(CW\*(C`PERL5_CPAN_IS_EXECUTING\*(C'\fR is set to the full path of the
+\&\f(CW\*(C`Makefile.PL\*(C'\fR that is being executed. This prevents runaway processes
+with newer versions of Module::Install.
+.PP
+When the config variable ftp_passive is set, all downloads will be run
+with the environment variable FTP_PASSIVE set to this value. This is
+in general a good idea as it influences both Net::FTP and LWP based
+connections. The same effect can be achieved by starting the cpan
+shell with this environment variable set. For Net::FTP alone, one can
+also always set passive mode by running libnetcfg.
+.SH "POPULATE AN INSTALLATION WITH LOTS OF MODULES"
+.IX Header "POPULATE AN INSTALLATION WITH LOTS OF MODULES"
+Populating a freshly installed perl with one's favorite modules is pretty
+easy if you maintain a private bundle definition file. To get a useful
+blueprint of a bundle definition file, the command autobundle can be used
+on the CPAN shell command line. This command writes a bundle definition
+file for all modules installed for the current perl
+interpreter. It's recommended to run this command once only, and from then
+on maintain the file manually under a private name, say
+Bundle/my_bundle.pm. With a clever bundle file you can then simply say
+.PP
+.Vb 1
+\& cpan> install Bundle::my_bundle
+.Ve
+.PP
+then answer a few questions and go out for coffee (possibly
+even in a different city).
+.PP
+Maintaining a bundle definition file means keeping track of two
+things: dependencies and interactivity. CPAN.pm sometimes fails on
+calculating dependencies because not all modules define all MakeMaker
+attributes correctly, so a bundle definition file should specify
+prerequisites as early as possible. On the other hand, it's
+annoying that so many distributions need some interactive configuring. So
+what you can try to accomplish in your private bundle file is to have the
+packages that need to be configured early in the file and the gentle
+ones later, so you can go out for coffee after a few minutes and leave CPAN.pm
+to churn away unattended.
+.SH "WORKING WITH CPAN.pm BEHIND FIREWALLS"
+.IX Header "WORKING WITH CPAN.pm BEHIND FIREWALLS"
+Thanks to Graham Barr for contributing the following paragraphs about
+the interaction between perl, and various firewall configurations. For
+further information on firewalls, it is recommended to consult the
+documentation that comes with the \fIncftp\fR program. If you are unable to
+go through the firewall with a simple Perl setup, it is likely
+that you can configure \fIncftp\fR so that it works through your firewall.
+.SS "Three basic types of firewalls"
+.IX Subsection "Three basic types of firewalls"
+Firewalls can be categorized into three basic types.
+.IP "http firewall" 4
+.IX Item "http firewall"
+This is when the firewall machine runs a web server, and to access the
+outside world, you must do so via that web server. If you set environment
+variables like http_proxy or ftp_proxy to values beginning with http://,
+or in your web browser you've proxy information set, then you know
+you are running behind an http firewall.
+.Sp
+To access servers outside these types of firewalls with perl (even for
+ftp), you need LWP or HTTP::Tiny.
+.IP "ftp firewall" 4
+.IX Item "ftp firewall"
+This where the firewall machine runs an ftp server. This kind of
+firewall will only let you access ftp servers outside the firewall.
+This is usually done by connecting to the firewall with ftp, then
+entering a username like "user@outside.host.com".
+.Sp
+To access servers outside these type of firewalls with perl, you
+need Net::FTP.
+.IP "One-way visibility" 4
+.IX Item "One-way visibility"
+One-way visibility means these firewalls try to make themselves
+invisible to users inside the firewall. An FTP data connection is
+normally created by sending your IP address to the remote server and then
+listening for the return connection. But the remote server will not be able to
+connect to you because of the firewall. For these types of firewall,
+FTP connections need to be done in a passive mode.
+.Sp
+There are two that I can think off.
+.RS 4
+.IP SOCKS 4
+.IX Item "SOCKS"
+If you are using a SOCKS firewall, you will need to compile perl and link
+it with the SOCKS library. This is what is normally called a 'socksified'
+perl. With this executable you will be able to connect to servers outside
+the firewall as if it were not there.
+.IP "IP Masquerade" 4
+.IX Item "IP Masquerade"
+This is when the firewall implemented in the kernel (via NAT, or networking
+address translation), it allows you to hide a complete network behind one
+IP address. With this firewall no special compiling is needed as you can
+access hosts directly.
+.Sp
+For accessing ftp servers behind such firewalls you usually need to
+set the environment variable \f(CW\*(C`FTP_PASSIVE\*(C'\fR or the config variable
+ftp_passive to a true value.
+.RE
+.RS 4
+.RE
+.SS "Configuring lynx or ncftp for going through a firewall"
+.IX Subsection "Configuring lynx or ncftp for going through a firewall"
+If you can go through your firewall with e.g. lynx, presumably with a
+command such as
+.PP
+.Vb 1
+\& /usr/local/bin/lynx \-pscott:tiger
+.Ve
+.PP
+then you would configure CPAN.pm with the command
+.PP
+.Vb 1
+\& o conf lynx "/usr/local/bin/lynx \-pscott:tiger"
+.Ve
+.PP
+That's all. Similarly for ncftp or ftp, you would configure something
+like
+.PP
+.Vb 1
+\& o conf ncftp "/usr/bin/ncftp \-f /home/scott/ncftplogin.cfg"
+.Ve
+.PP
+Your mileage may vary...
+.SH FAQ
+.IX Header "FAQ"
+.IP 1) 4
+.IX Item "1)"
+I installed a new version of module X but CPAN keeps saying,
+I have the old version installed
+.Sp
+Probably you \fBdo\fR have the old version installed. This can
+happen if a module installs itself into a different directory in the
+\&\f(CW@INC\fR path than it was previously installed. This is not really a
+CPAN.pm problem, you would have the same problem when installing the
+module manually. The easiest way to prevent this behaviour is to add
+the argument \f(CW\*(C`UNINST=1\*(C'\fR to the \f(CW\*(C`make install\*(C'\fR call, and that is why
+many people add this argument permanently by configuring
+.Sp
+.Vb 1
+\& o conf make_install_arg UNINST=1
+.Ve
+.IP 2) 4
+.IX Item "2)"
+So why is UNINST=1 not the default?
+.Sp
+Because there are people who have their precise expectations about who
+may install where in the \f(CW@INC\fR path and who uses which \f(CW@INC\fR array. In
+fine tuned environments \f(CW\*(C`UNINST=1\*(C'\fR can cause damage.
+.IP 3) 4
+.IX Item "3)"
+I want to clean up my mess, and install a new perl along with
+all modules I have. How do I go about it?
+.Sp
+Run the autobundle command for your old perl and optionally rename the
+resulting bundle file (e.g. Bundle/mybundle.pm), install the new perl
+with the Configure option prefix, e.g.
+.Sp
+.Vb 1
+\& ./Configure \-Dprefix=/usr/local/perl\-5.6.78.9
+.Ve
+.Sp
+Install the bundle file you produced in the first step with something like
+.Sp
+.Vb 1
+\& cpan> install Bundle::mybundle
+.Ve
+.Sp
+and you're done.
+.IP 4) 4
+.IX Item "4)"
+When I install bundles or multiple modules with one command
+there is too much output to keep track of.
+.Sp
+You may want to configure something like
+.Sp
+.Vb 2
+\& o conf make_arg "| tee \-ai /root/.cpan/logs/make.out"
+\& o conf make_install_arg "| tee \-ai /root/.cpan/logs/make_install.out"
+.Ve
+.Sp
+so that STDOUT is captured in a file for later inspection.
+.IP 5) 4
+.IX Item "5)"
+I am not root, how can I install a module in a personal directory?
+.Sp
+As of CPAN 1.9463, if you do not have permission to write the default perl
+library directories, CPAN's configuration process will ask you whether
+you want to bootstrap <local::lib>, which makes keeping a personal
+perl library directory easy.
+.Sp
+Another thing you should bear in mind is that the UNINST parameter can
+be dangerous when you are installing into a private area because you
+might accidentally remove modules that other people depend on that are
+not using the private area.
+.IP 6) 4
+.IX Item "6)"
+How to get a package, unwrap it, and make a change before building it?
+.Sp
+Have a look at the \f(CW\*(C`look\*(C'\fR (!) command.
+.IP 7) 4
+.IX Item "7)"
+I installed a Bundle and had a couple of fails. When I
+retried, everything resolved nicely. Can this be fixed to work
+on first try?
+.Sp
+The reason for this is that CPAN does not know the dependencies of all
+modules when it starts out. To decide about the additional items to
+install, it just uses data found in the META.yml file or the generated
+Makefile. An undetected missing piece breaks the process. But it may
+well be that your Bundle installs some prerequisite later than some
+depending item and thus your second try is able to resolve everything.
+Please note, CPAN.pm does not know the dependency tree in advance and
+cannot sort the queue of things to install in a topologically correct
+order. It resolves perfectly well \fBif\fR all modules declare the
+prerequisites correctly with the PREREQ_PM attribute to MakeMaker or
+the \f(CW\*(C`requires\*(C'\fR stanza of Module::Build. For bundles which fail and
+you need to install often, it is recommended to sort the Bundle
+definition file manually.
+.IP 8) 4
+.IX Item "8)"
+In our intranet, we have many modules for internal use. How
+can I integrate these modules with CPAN.pm but without uploading
+the modules to CPAN?
+.Sp
+Have a look at the CPAN::Site module.
+.IP 9) 4
+.IX Item "9)"
+When I run CPAN's shell, I get an error message about things in my
+\&\f(CW\*(C`/etc/inputrc\*(C'\fR (or \f(CW\*(C`~/.inputrc\*(C'\fR) file.
+.Sp
+These are readline issues and can only be fixed by studying readline
+configuration on your architecture and adjusting the referenced file
+accordingly. Please make a backup of the \f(CW\*(C`/etc/inputrc\*(C'\fR or \f(CW\*(C`~/.inputrc\*(C'\fR
+and edit them. Quite often harmless changes like uppercasing or
+lowercasing some arguments solves the problem.
+.IP 10) 4
+.IX Item "10)"
+Some authors have strange characters in their names.
+.Sp
+Internally CPAN.pm uses the UTF\-8 charset. If your terminal is
+expecting ISO\-8859\-1 charset, a converter can be activated by setting
+term_is_latin to a true value in your config file. One way of doing so
+would be
+.Sp
+.Vb 1
+\& cpan> o conf term_is_latin 1
+.Ve
+.Sp
+If other charset support is needed, please file a bug report against
+CPAN.pm at rt.cpan.org and describe your needs. Maybe we can extend
+the support or maybe UTF\-8 terminals become widely available.
+.Sp
+Note: this config variable is deprecated and will be removed in a
+future version of CPAN.pm. It will be replaced with the conventions
+around the family of \f(CW$LANG\fR and \f(CW$LC_\fR* environment variables.
+.IP 11) 4
+.IX Item "11)"
+When an install fails for some reason and then I correct the error
+condition and retry, CPAN.pm refuses to install the module, saying
+\&\f(CW\*(C`Already tried without success\*(C'\fR.
+.Sp
+Use the force pragma like so
+.Sp
+.Vb 1
+\& force install Foo::Bar
+.Ve
+.Sp
+Or you can use
+.Sp
+.Vb 1
+\& look Foo::Bar
+.Ve
+.Sp
+and then \f(CW\*(C`make install\*(C'\fR directly in the subshell.
+.IP 12) 4
+.IX Item "12)"
+How do I install a "DEVELOPER RELEASE" of a module?
+.Sp
+By default, CPAN will install the latest non-developer release of a
+module. If you want to install a dev release, you have to specify the
+partial path starting with the author id to the tarball you wish to
+install, like so:
+.Sp
+.Vb 1
+\& cpan> install KWILLIAMS/Module\-Build\-0.27_07.tar.gz
+.Ve
+.Sp
+Note that you can use the \f(CW\*(C`ls\*(C'\fR command to get this path listed.
+.IP 13) 4
+.IX Item "13)"
+How do I install a module and all its dependencies from the commandline,
+without being prompted for anything, despite my CPAN configuration
+(or lack thereof)?
+.Sp
+CPAN uses ExtUtils::MakeMaker's \fBprompt()\fR function to ask its questions, so
+if you set the PERL_MM_USE_DEFAULT environment variable, you shouldn't be
+asked any questions at all (assuming the modules you are installing are
+nice about obeying that variable as well):
+.Sp
+.Vb 1
+\& % PERL_MM_USE_DEFAULT=1 perl \-MCPAN \-e \*(Aqinstall My::Module\*(Aq
+.Ve
+.IP 14) 4
+.IX Item "14)"
+How do I create a Module::Build based Build.PL derived from an
+ExtUtils::MakeMaker focused Makefile.PL?
+.Sp
+http://search.cpan.org/dist/Module\-Build\-Convert/
+.IP 15) 4
+.IX Item "15)"
+I'm frequently irritated with the CPAN shell's inability to help me
+select a good mirror.
+.Sp
+CPAN can now help you select a "good" mirror, based on which ones have the
+lowest 'ping' round-trip times. From the shell, use the command 'o conf init
+urllist' and allow CPAN to automatically select mirrors for you.
+.Sp
+Beyond that help, the urllist config parameter is yours. You can add and remove
+sites at will. You should find out which sites have the best up-to-dateness,
+bandwidth, reliability, etc. and are topologically close to you. Some people
+prefer fast downloads, others up-to-dateness, others reliability. You decide
+which to try in which order.
+.Sp
+Henk P. Penning maintains a site that collects data about CPAN sites:
+.Sp
+.Vb 1
+\& http://mirrors.cpan.org/
+.Ve
+.Sp
+Also, feel free to play with experimental features. Run
+.Sp
+.Vb 1
+\& o conf init randomize_urllist ftpstats_period ftpstats_size
+.Ve
+.Sp
+and choose your favorite parameters. After a few downloads running the
+\&\f(CW\*(C`hosts\*(C'\fR command will probably assist you in choosing the best mirror
+sites.
+.IP 16) 4
+.IX Item "16)"
+Why do I get asked the same questions every time I start the shell?
+.Sp
+You can make your configuration changes permanent by calling the
+command \f(CW\*(C`o conf commit\*(C'\fR. Alternatively set the \f(CW\*(C`auto_commit\*(C'\fR
+variable to true by running \f(CW\*(C`o conf init auto_commit\*(C'\fR and answering
+the following question with yes.
+.IP 17) 4
+.IX Item "17)"
+Older versions of CPAN.pm had the original root directory of all
+tarballs in the build directory. Now there are always random
+characters appended to these directory names. Why was this done?
+.Sp
+The random characters are provided by File::Temp and ensure that each
+module's individual build directory is unique. This makes running
+CPAN.pm in concurrent processes simultaneously safe.
+.IP 18) 4
+.IX Item "18)"
+Speaking of the build directory. Do I have to clean it up myself?
+.Sp
+You have the choice to set the config variable \f(CW\*(C`scan_cache\*(C'\fR to
+\&\f(CW\*(C`never\*(C'\fR. Then you must clean it up yourself. The other possible
+values, \f(CW\*(C`atstart\*(C'\fR and \f(CW\*(C`atexit\*(C'\fR clean up the build directory when you
+start (or more precisely, after the first extraction into the build
+directory) or exit the CPAN shell, respectively. If you never start up
+the CPAN shell, you probably also have to clean up the build directory
+yourself.
+.IP 19) 4
+.IX Item "19)"
+How can I switch to sudo instead of local::lib?
+.Sp
+The following 5 environment veriables need to be reset to the previous
+values: PATH, PERL5LIB, PERL_LOCAL_LIB_ROOT, PERL_MB_OPT, PERL_MM_OPT;
+and these two CPAN.pm config variables must be reconfigured:
+make_install_make_command and mbuild_install_build_command. The five
+env variables have probably been overwritten in your \f(CW$HOME\fR/.bashrc or
+some equivalent. You either find them there and delete their traces
+and logout/login or you override them temporarily, depending on your
+exact desire. The two cpanpm config variables can be set with:
+.Sp
+.Vb 1
+\& o conf init /install_.*_command/
+.Ve
+.Sp
+probably followed by
+.Sp
+.Vb 1
+\& o conf commit
+.Ve
+.SH COMPATIBILITY
+.IX Header "COMPATIBILITY"
+.SS "OLD PERL VERSIONS"
+.IX Subsection "OLD PERL VERSIONS"
+CPAN.pm is regularly tested to run under 5.005 and assorted
+newer versions. It is getting more and more difficult to get the
+minimal prerequisites working on older perls. It is close to
+impossible to get the whole Bundle::CPAN working there. If you're in
+the position to have only these old versions, be advised that CPAN is
+designed to work fine without the Bundle::CPAN installed.
+.PP
+To get things going, note that GBARR/Scalar\-List\-Utils\-1.18.tar.gz is
+compatible with ancient perls and that File::Temp is listed as a
+prerequisite but CPAN has reasonable workarounds if it is missing.
+.SS CPANPLUS
+.IX Subsection "CPANPLUS"
+This module and its competitor, the CPANPLUS module, are both much
+cooler than the other. CPAN.pm is older. CPANPLUS was designed to be
+more modular, but it was never intended to be compatible with CPAN.pm.
+.SS CPANMINUS
+.IX Subsection "CPANMINUS"
+In the year 2010 App::cpanminus was launched as a new approach to a
+cpan shell with a considerably smaller footprint. Very cool stuff.
+.SH "SECURITY ADVICE"
+.IX Header "SECURITY ADVICE"
+This software enables you to upgrade software on your computer and so
+is inherently dangerous because the newly installed software may
+contain bugs and may alter the way your computer works or even make it
+unusable. Please consider backing up your data before every upgrade.
+.SH BUGS
+.IX Header "BUGS"
+Please report bugs via <http://rt.cpan.org/>
+.PP
+Before submitting a bug, please make sure that the traditional method
+of building a Perl module package from a shell by following the
+installation instructions of that package still works in your
+environment.
+.SH AUTHOR
+.IX Header "AUTHOR"
+Andreas Koenig \f(CW\*(C`<andk@cpan.org>\*(C'\fR
+.SH LICENSE
+.IX Header "LICENSE"
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+.PP
+See <http://www.perl.com/perl/misc/Artistic.html>
+.SH TRANSLATIONS
+.IX Header "TRANSLATIONS"
+Kawai,Takanori provides a Japanese translation of a very old version
+of this manpage at
+<http://homepage3.nifty.com/hippo2000/perltips/CPAN.htm>
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+Many people enter the CPAN shell by running the cpan utility
+program which is installed in the same directory as perl itself. So if
+you have this directory in your PATH variable (or some equivalent in
+your operating system) then typing \f(CW\*(C`cpan\*(C'\fR in a console window will
+work for you as well. Above that the utility provides several
+commandline shortcuts.
+.PP
+melezhik (Alexey) sent me a link where he published a chef recipe to
+work with CPAN.pm: http://community.opscode.com/cookbooks/cpan.