The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
# $Id: cpan,v 1.3 2002/08/30 08:55:15 k Exp $
use strict;

=head1 NAME

cpan - easily interact with CPAN from the command line

=head1 SYNOPSIS

	# with arguments, installs specified modules
	cpan module_name [ module_name ... ]
	
	# with switches, installs modules with extra behavior
	cpan [-cimt] module_name [ module_name ... ]
	
	# without arguments, starts CPAN shell
	cpan
	
	# without arguments, but some switches
	cpan [-ahrv]

=head1 DESCRIPTION

This script provides a command interface (not a shell) to CPAN.pm.

=head2 Meta Options

These options are mutually exclusive, and the script processes
them in this order: [ahvr].  Once the script finds one, it ignores
the others, and then exits after it finishes the task.  The script
ignores any other command line options.

=over 4

=item -a

Creates the CPAN.pm autobundle with CPAN::Shell->autobundle.  

=item -h

Prints a help message.

=item -r

Recompiles dynamically loaded modules with CPAN::Shell->recompile.

=item -v

Print the script version and CPAN.pm version.

=back

=head2 Module options

These options are mutually exclusive, and the script processes
them in alphabetical order. 

=over 4

=item c

Runs a `make clean` in the specified module's directories.

=item i

Installed the specified modules.

=item m

Makes the specified modules.

=item t

Runs a `make test` on the specified modules.

=back

=head2 Examples

	# print a help message
	cpan -h
	
	# print the version numbers
	cpan -v
	
	# create an autobundle
	cpan -a
	
	# recompile modules
	cpan -r 
	
	# install modules
	cpan -i Netscape::Booksmarks Business::ISBN

=head1 TO DO

* add options for other CPAN::Shell functions
autobundle, clean, make, recompile, test

=head1 BUGS

* none noted

=head1 SEE ALSO

Most behaviour, including environment variables and configuration,
comes directly from CPAN.pm.

=head1 AUTHOR

brian d foy <bdfoy@cpan.org>

=cut

use CPAN ();
use Getopt::Std;

my $VERSION = 
	sprintf "%d.%02d", q$Revision: 1.3 $ =~ m/ (\d+) \. (\d+) /xg;

my $Default = 'default';

my $META_OPTIONS = 'ahvr';

my %CPAN_METHODS = (
	$Default => 'install',
	'c'      => 'clean',
	'i'      => 'install',
	'm'      => 'make',
	't'      => 'test',
	);

my @cpan_options = grep { $_ ne $Default } sort keys %CPAN_METHODS;

my $arg_count = @ARGV;
my %options;

Getopt::Std::getopts( 
	join( '', @cpan_options, $META_OPTIONS ), \%options );
	
if( $options{h} )
	{
	print STDERR "Printing help message -- ignoring other arguments\n"
		if $arg_count > 1;

	print STDERR "Use perldoc to read the documentation\n";
	exit 0;
	}
elsif( $options{v} )
	{
	print STDERR "Printing version message -- ignoring other arguments\n"
	
		if $arg_count > 1;

	my $CPAN_VERSION = CPAN->VERSION;
	print STDERR "cpan script version $VERSION\n" .
		"CPAN.pm version $CPAN_VERSION\n";
	exit 0;
	}
elsif( $options{a} )
	{
	print "Creating autobundle in ", $CPAN::Config->{cpan_home}, 
		"/Bundle\n";
	print STDERR "Creating autobundle -- ignoring other arguments\n"
		if $arg_count > 1;

	CPAN::Shell->autobundle;
	exit 0;
	}
elsif( $options{r} )
	{
	print STDERR "Creating autobundle -- ignoring other arguments\n"
		if $arg_count > 1;
		
	CPAN::Shell->recompile;
	}
else
	{
	my $switch = '';
	
	foreach my $option ( @cpan_options )
		{
		next unless $options{$option};
		$switch = $option;
		last;
		}
	
	   if( not $switch and     @ARGV ) { $switch = $Default;     }
	elsif( not $switch and not @ARGV ) { CPAN::shell(); exit 0;  }	
	elsif(     $switch and not @ARGV ) 
		{ die "Nothing to $CPAN_METHODS{$switch}!\n"; }

	my $method = $CPAN_METHODS{$switch};
	die "CPAN.pm cannot $method!\n" unless CPAN::Shell->can( $method );
	
	foreach my $arg ( @ARGV )
		{
		CPAN::Shell->$method( $arg );
		}
	}
	
1;