#!/usr/bin/perl
    eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
#!/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;