#!perl use strict; use warnings; use lib 'lib'; use Data::Dumper; use Getopt::Long; use BackPAN::Index; my $index_url; GetOptions( 'index' => \$index_url ); my $args = $index_url ? { backpan_index_url => $index_url } : {}; my $backpan = BackPAN::Index->new($args); sub usage { my $cmd = shift; print STDERR <<USAGE if $cmd; Unknown command '$cmd' USAGE print STDERR <<USAGE; Usage: $0 dist <dist name> $0 dists_by <cpanid> USAGE exit 1; } my $cmd = shift; my $arg = shift; my %Commands = ( dist => \&command_dist, dists_by => \&command_dists_by ); main($cmd, $arg); sub main { my $func = $Commands{$cmd} || do { usage($cmd) }; $func->($arg); } sub command_dist { my $name = shift; my $backpan = BackPAN::Index->new; my $dist = $backpan->dist($name); do { print "Unknown dist '$dist'.\n"; exit 1; } unless $dist; print <<OUT; Name: @{[ $dist->name ]} Authors: @{[ join ", ", $dist->authors ]} Releases: OUT for my $release ($dist->releases->search(undef, { order_by => "version" })) { my $distvname = $release->distvname; print " $distvname\n"; } } sub command_dists_by { my $cpanid = shift; my $backpan = BackPAN::Index->new; my @dists = $backpan->dists_by($cpanid); do { print "CPANID '$cpanid' has no distributions.\n"; exit 1; } unless @dists; print join "\n", map { $_->name } @dists; } __END__ =head1 NAME examples/backpan.pl - a simple demo for BackPAN::Index =head1 USAGE $ perl examples/backpan.pl dist Dist-Name $ perl examples/backpan.pl dist_by CPANID =head1 DESCRIPTION This demo creates a BackPAN::Index instance, which downloads from web and parses a BACKPAN index and then shows up either the distributions of a given name or the the distributions of a certain CPAN author. =cut