diff options
61 files changed, 38027 insertions, 338 deletions
diff --git a/.gitignore b/.gitignore index c13c2f07c..85b7ca758 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /private_locale ._* .DS_Store +.carton local-lib5 META.yml Makefile @@ -18,5 +19,9 @@ tags /web/css/core.css /web/css/main.css /web/cobrands/fixmystreet/*.css +/local -/web/cobrands/fixmystreet/compass_app_log.txt
\ No newline at end of file +/web/cobrands/fixmystreet/compass_app_log.txt +blog/web/wp +blog/conf/general +blog/conf/general.deployed diff --git a/README.pod b/README.pod index f6041e286..6b4494f38 100644 --- a/README.pod +++ b/README.pod @@ -1,19 +1,76 @@ +=head1 Welcome to FixMyStreet -=head1 NAME +FixMyStreet is an open source project to develop a website for reporting +problems such as potholes and broken street lights to the appropriate authority. -FixMyStreet +Users locate problems using a combination of address and sticking a pin +in a map without worrying about the correct authority to report it to. +FixMyStreet then works out the correct authority to report it to using +the problem location and type and sends a report. -=head1 DESCRIPTION +It was created in 2007 by L<mySociety|http://www.mysociety.org> for reporting problems to UK councils and +has been copied around the world. -FixMyStreet is a project that allows anyone to report an issue such as potholes, -broken street lights, severe littering, water leaks. These issues are then -routed to the correct body who can arrange to have them fixed. +We're working hard to make it easy to install and re-use in other +countries and welcome questions about how it works on our mailing list: +L<https://secure.mysociety.org/admin/lists/mailman/listinfo/fixmystreet>. -=head1 INSTALLING +We've also got a new site and blog which over time will become a useful +resource for people interested in installing or developing FixMyStreet +at L<http://code.fixmystreet.com/>. -Installing from scratch can be a bit daunting but is fully documented in the -notes/INSTALL file. +FixMyStreet is written in Perl and uses the Catalyst web framework. -We are hoping to make it much easier for you to try the code by letting you -start a fully installed system with test data pre-loaded on Amazon's servers. -More details will follow soon. +=head1 EXAMPLES + +L<http://www.fixmystreet.com> + +L<http://www.fiksgatami.no/> + +=head1 QUICKSTART + +If you're reasonably sure what you are doing then you can follow the +quickstart instructions. Otherwise there are more detailed instructions +in C<notes/INSTALL.pod> + +=over + +=item * + +Fetch the latest version from L<Github|https://github.com/mysociety/fixmystreet/> + +=item * + +Create a new PostGIS enabled database + +=item * + +Create the database using C<db/schema.sql> and the C<db/alert_types.sql> + +=item * + +Run C<./bin/install_perl_modules> to install the required Perl modules. + +=item * + +Create a new Apache vhost based on C<conf/httpd-conf.example> + +=item * + +Copy C<conf/general.yml-example> to C<conf/general.yml> and update +the defaults accordingly. + +=item * + +Generate the CSS by running C<bin/make_css> + +=item * + +Restart the webserver + +=item * + +Edit the crontab from C<conf/crontab> to replace the placeholders and +install it. See C<notes/INSTALL.pod> for more details on the placeholders. + +=back diff --git a/bin/cpanm b/bin/cpanm new file mode 100755 index 000000000..14a9a3cb4 --- /dev/null +++ b/bin/cpanm @@ -0,0 +1,11316 @@ +#!/usr/bin/env perl +# +# You want to install cpanminus? Run the following command and it will +# install itself for you. You might want to run it as a root with sudo +# if you want to install to places like /usr/local/bin. +# +# % curl -L http://cpanmin.us | perl - --self-upgrade +# +# If you don't have curl but wget, replace `curl -L` with `wget -O -`. +# +# For more details about this program, visit http://search.cpan.org/dist/App-cpanminus +# +# DO NOT EDIT -- this is an auto generated file +# This chunk of stuff was generated by App::FatPacker. To find the original +# file's code, look for the end of this BEGIN block or the string 'FATPACK' +BEGIN { +my %fatpacked; + +$fatpacked{"App/cpanminus.pm"} = <<'APP_CPANMINUS'; + package App::cpanminus; + our $VERSION = "1.5007"; + + =head1 NAME + + App::cpanminus - get, unpack, build and install modules from CPAN + + =head1 SYNOPSIS + + cpanm Module + + Run C<cpanm -h> for more options. + + =head1 DESCRIPTION + + cpanminus is a script to get, unpack, build and install modules from + CPAN and does nothing else. + + It's dependency free (can bootstrap itself), requires zero + configuration, and stands alone. When running, it requires only 10MB + of RAM. + + =head1 INSTALLATION + + There are several ways to install cpanminus to your system. + + =head2 Package management system + + There are Debian packages, RPMs, FreeBSD ports, and packages for other + operation systems available. If you want to use the package management system, + search for cpanminus and use the appropriate command to install. This makes it + easy to install C<cpanm> to your system without thinking about where to + install, and later upgrade. + + =head2 Installing to system perl + + You can also use the latest cpanminus to install cpanminus itself: + + curl -L http://cpanmin.us | perl - --sudo App::cpanminus + + This will install C<cpanm> to your bin directory like + C</usr/local/bin> (unless you configured C<INSTALL_BASE> with + L<local::lib>), so you probably need the C<--sudo> option. + + =head2 Installing to local perl (perlbrew) + + If you have perl in your home directory, which is the case if you use + tools like L<perlbrew>, you don't need the C<--sudo> option, since + you're most likely to have a write permission to the perl's library + path. You can just do: + + curl -L http://cpanmin.us | perl - App::cpanminus + + to install the C<cpanm> executable to the perl's bin path, like + C<~/perl5/perlbrew/bin/cpanm>. + + =head2 Downloading the standalone executable + + You can also copy the standalone executable to whatever location you'd like. + + cd ~/bin + curl -LO http://xrl.us/cpanm + chmod +x cpanm + # edit shebang if you don't have /usr/bin/env + + This just works, but be sure to grab the new version manually when you + upgrade because C<--self-upgrade> might not work for this. + + =head1 DEPENDENCIES + + perl 5.8 or later. + + =over 4 + + =item * + + 'tar' executable (bsdtar or GNU tar version 1.22 are rcommended) or Archive::Tar to unpack files. + + =item * + + C compiler, if you want to build XS modules. + + =item * + + make + + =item * + + Module::Build (core in 5.10) + + =back + + =head1 QUESTIONS + + =head2 Another CPAN installer? + + OK, the first motivation was this: the CPAN shell runs out of memory (or swaps + heavily and gets really slow) on Slicehost/linode's most affordable plan with + only 256MB RAM. Should I pay more to install perl modules from CPAN? I don't + think so. + + =head2 But why a new client? + + First of all, let me be clear that CPAN and CPANPLUS are great tools + I've used for I<literally> years (you know how many modules I have on + CPAN, right?). I really respect their efforts of maintaining the most + important tools in the CPAN toolchain ecosystem. + + However, for less experienced users (mostly from outside the Perl community), + or even really experienced Perl developers who know how to shoot themselves in + their feet, setting up the CPAN toolchain often feels like yak shaving, + especially when all they want to do is just install some modules and start + writing code. + + =head2 Zero-conf? How does this module get/parse/update the CPAN index? + + It queries the CPAN Meta DB site running on Google AppEngine at + L<http://cpanmetadb.plackperl.org/>. The site is updated every hour to reflect + the latest changes from fast syncing mirrors. The script then also falls back + to scrape the site L<http://search.cpan.org/>. + + Fetched files are unpacked in C<~/.cpanm> and automatically cleaned up + periodically. You can configure the location of this with the + C<PERL_CPANM_HOME> environment variable. + + =head2 Where does this install modules to? Do I need root access? + + It installs to wherever ExtUtils::MakeMaker and Module::Build are + configured to (via C<PERL_MM_OPT> and C<PERL_MB_OPT>). So if you're + using local::lib, then it installs to your local perl5 + directory. Otherwise it installs to the site_perl directory that + belongs to your perl. + + cpanminus at a boot time checks whether you have configured + local::lib, or have the permission to install modules to the site_perl + directory. If neither, it automatically sets up local::lib compatible + installation path in a C<perl5> directory under your home + directory. To avoid this, run the script as the root user, with + C<--sudo> option or with C<--local-lib> option. + + =head2 cpanminus can't install the module XYZ. Is it a bug? + + It is more likely a problem with the distribution itself. cpanminus + doesn't support or is known to have issues with distributions like as + follows: + + =over 4 + + =item * + + Tests that require input from STDIN. + + =item * + + Tests that might fail when C<AUTOMATED_TESTING> is enabled. + + =item * + + Modules that have invalid numeric values as VERSION (such as C<1.1a>) + + =back + + These failures can be reported back to the author of the module so + that they can fix it accordingly, rather than me. + + =head2 Does cpanm support the feature XYZ of L<CPAN> and L<CPANPLUS>? + + Most likely not. Here are the things that cpanm doesn't do by + itself. And it's a feature - you got that from the name I<minus>, + right? + + If you need these features, use L<CPAN>, L<CPANPLUS> or the standalone + tools that are mentioned. + + =over 4 + + =item * + + Bundle:: module dependencies + + =item * + + CPAN testers reporting + + =item * + + Building RPM packages from CPAN modules + + =item * + + Listing the outdated modules that needs upgrading. See L<App::cpanoutdated> + + =item * + + Uninstalling modules. See L<pm-uninstall>. + + =item * + + Showing the changes of the modules you're about to upgrade. See L<cpan-listchanges> + + =item * + + Patching CPAN modules with distroprefs. + + =back + + See L<cpanm> or C<cpanm -h> to see what cpanminus I<can> do :) + + =head1 COPYRIGHT + + Copyright 2010- Tatsuhiko Miyagawa + + The standalone executable contains the following modules embedded. + + =over 4 + + =item L<CPAN::DistnameInfo> Copyright 2003 Graham Barr + + =item L<Parse::CPAN::Meta> Copyright 2006-2009 Adam Kennedy + + =item L<local::lib> Copyright 2007-2009 Matt S Trout + + =item L<HTTP::Tiny> Copyright 2011 Christian Hansen + + =item L<Module::Metadata> Copyright 2001-2006 Ken Williams. 2010 Matt S Trout + + =item L<version> Copyright 2004-2010 John Peacock + + =item L<JSON::PP> Copyright 2007−2011 by Makamaka Hannyaharamitu + + =item L<CPAN::Meta> Copyright (c) 2010 by David Golden and Ricardo Signes + + =item L<Try::Tiny> Copyright (c) 2009 Yuval Kogman + + =item L<parent> Copyright (c) 2007-10 Max Maischein + + =item L<Version::Requirements> copyright (c) 2010 by Ricardo Signes + + =item L<CPAN::Meta::YAML> copyright (c) 2010 by Adam Kennedy + + =back + + =head1 LICENSE + + Same as Perl. + + =head1 CREDITS + + =head2 CONTRIBUTORS + + Patches and code improvements were contributed by: + + Goro Fuji, Kazuhiro Osawa, Tokuhiro Matsuno, Kenichi Ishigaki, Ian + Wells, Pedro Melo, Masayoshi Sekimura, Matt S Trout (mst), squeeky, + horus and Ingy dot Net. + + =head2 ACKNOWLEDGEMENTS + + Bug reports, suggestions and feedbacks were sent by, or general + acknowledgement goes to: + + Jesse Vincent, David Golden, Andreas Koenig, Jos Boumans, Chris + Williams, Adam Kennedy, Audrey Tang, J. Shirley, Chris Prather, Jesse + Luehrs, Marcus Ramberg, Shawn M Moore, chocolateboy, Chirs Nehren, + Jonathan Rockway, Leon Brocard, Simon Elliott, Ricardo Signes, AEvar + Arnfjord Bjarmason, Eric Wilhelm, Florian Ragwitz and xaicron. + + =head1 COMMUNITY + + =over 4 + + =item L<http://github.com/miyagawa/cpanminus> - source code repository, issue tracker + + =item L<irc://irc.perl.org/#toolchain> - discussions about Perl toolchain. I'm there. + + =back + + =head1 NO WARRANTY + + This software is provided "as-is," without any express or implied + warranty. In no event shall the author be held liable for any damages + arising from the use of the software. + + =head1 SEE ALSO + + L<CPAN> L<CPANPLUS> L<pip> + + =cut + + 1; +APP_CPANMINUS + +$fatpacked{"App/cpanminus/script.pm"} = <<'APP_CPANMINUS_SCRIPT'; + package App::cpanminus::script; + use strict; + use Config; + use Cwd (); + use File::Basename (); + use File::Find (); + use File::Path (); + use File::Spec (); + use File::Copy (); + use Getopt::Long (); + use Parse::CPAN::Meta; + use Symbol (); + + use constant WIN32 => $^O eq 'MSWin32'; + use constant SUNOS => $^O eq 'solaris'; + + our $VERSION = "1.5007"; + + my $quote = WIN32 ? q/"/ : q/'/; + + sub new { + my $class = shift; + + bless { + home => "$ENV{HOME}/.cpanm", + cmd => 'install', + seen => {}, + notest => undef, + installdeps => undef, + force => undef, + sudo => undef, + make => undef, + verbose => undef, + quiet => undef, + interactive => undef, + log => undef, + mirrors => [], + mirror_only => undef, + mirror_index => undef, + perl => $^X, + argv => [], + local_lib => undef, + self_contained => undef, + prompt_timeout => 0, + prompt => undef, + configure_timeout => 60, + try_lwp => 1, + try_wget => 1, + try_curl => 1, + uninstall_shadows => ($] < 5.012), + skip_installed => 1, + skip_satisfied => 0, + auto_cleanup => 7, # days + pod2man => 1, + installed_dists => 0, + showdeps => 0, + scandeps => 0, + scandeps_tree => [], + format => 'tree', + save_dists => undef, + skip_configure => 0, + @_, + }, $class; + } + + sub env { + my($self, $key) = @_; + $ENV{"PERL_CPANM_" . $key}; + } + + sub parse_options { + my $self = shift; + + local @ARGV = @{$self->{argv}}; + push @ARGV, split /\s+/, $self->env('OPT'); + push @ARGV, @_; + + Getopt::Long::Configure("bundling"); + Getopt::Long::GetOptions( + 'f|force' => sub { $self->{skip_installed} = 0; $self->{force} = 1 }, + 'n|notest!' => \$self->{notest}, + 'S|sudo!' => \$self->{sudo}, + 'v|verbose' => sub { $self->{verbose} = $self->{interactive} = 1 }, + 'q|quiet!' => \$self->{quiet}, + 'h|help' => sub { $self->{action} = 'show_help' }, + 'V|version' => sub { $self->{action} = 'show_version' }, + 'perl=s' => \$self->{perl}, + 'l|local-lib=s' => sub { $self->{local_lib} = $self->maybe_abs($_[1]) }, + 'L|local-lib-contained=s' => sub { + $self->{local_lib} = $self->maybe_abs($_[1]); + $self->{self_contained} = 1; + $self->{pod2man} = undef; + }, + 'mirror=s@' => $self->{mirrors}, + 'mirror-only!' => \$self->{mirror_only}, + 'mirror-index=s' => sub { $self->{mirror_index} = $_[1]; $self->{mirror_only} = 1 }, + 'cascade-search!' => \$self->{cascade_search}, + 'prompt!' => \$self->{prompt}, + 'installdeps' => \$self->{installdeps}, + 'skip-installed!' => \$self->{skip_installed}, + 'skip-satisfied!' => \$self->{skip_satisfied}, + 'reinstall' => sub { $self->{skip_installed} = 0 }, + 'interactive!' => \$self->{interactive}, + 'i|install' => sub { $self->{cmd} = 'install' }, + 'info' => sub { $self->{cmd} = 'info' }, + 'look' => sub { $self->{cmd} = 'look'; $self->{skip_installed} = 0 }, + 'self-upgrade' => sub { $self->{cmd} = 'install'; $self->{skip_installed} = 1; push @ARGV, 'App::cpanminus' }, + 'uninst-shadows!' => \$self->{uninstall_shadows}, + 'lwp!' => \$self->{try_lwp}, + 'wget!' => \$self->{try_wget}, + 'curl!' => \$self->{try_curl}, + 'auto-cleanup=s' => \$self->{auto_cleanup}, + 'man-pages!' => \$self->{pod2man}, + 'scandeps' => \$self->{scandeps}, + 'showdeps' => sub { $self->{showdeps} = 1; $self->{skip_installed} = 0 }, + 'format=s' => \$self->{format}, + 'save-dists=s' => sub { + $self->{save_dists} = $self->maybe_abs($_[1]); + }, + 'skip-configure!' => \$self->{skip_configure}, + 'metacpan' => \$self->{metacpan}, + ); + + if (!@ARGV && $0 ne '-' && !-t STDIN){ # e.g. # cpanm < author/requires.cpanm + push @ARGV, $self->load_argv_from_fh(\*STDIN); + $self->{load_from_stdin} = 1; + } + + $self->{argv} = \@ARGV; + } + + sub check_libs { + my $self = shift; + return if $self->{_checked}++; + + $self->bootstrap_local_lib; + if (@{$self->{bootstrap_deps} || []}) { + local $self->{notest} = 1; # test failure in bootstrap should be tolerated + local $self->{scandeps} = 0; + $self->install_deps(Cwd::cwd, 0, @{$self->{bootstrap_deps}}); + } + } + + sub doit { + my $self = shift; + + $self->setup_home; + $self->init_tools; + + if (my $action = $self->{action}) { + $self->$action() and return 1; + } + + $self->show_help(1) + unless @{$self->{argv}} or $self->{load_from_stdin}; + + $self->configure_mirrors; + + my $cwd = Cwd::cwd; + + my @fail; + for my $module (@{$self->{argv}}) { + if ($module =~ s/\.pm$//i) { + my ($volume, $dirs, $file) = File::Spec->splitpath($module); + $module = join '::', grep { $_ } File::Spec->splitdir($dirs), $file; + } + + ($module, my $version) = split /\~/, $module, 2; + if ($self->{skip_satisfied} or defined $version) { + $self->check_libs; + my($ok, $local) = $self->check_module($module, $version || 0); + if ($ok) { + $self->diag("You have $module (" . ($local || 'undef') . ")\n", 1); + next; + } + } + + $self->chdir($cwd); + $self->install_module($module, 0, $version) + or push @fail, $module; + } + + if ($self->{base} && $self->{auto_cleanup}) { + $self->cleanup_workdirs; + } + + if ($self->{installed_dists}) { + my $dists = $self->{installed_dists} > 1 ? "distributions" : "distribution"; + $self->diag("$self->{installed_dists} $dists installed\n", 1); + } + + if ($self->{scandeps}) { + $self->dump_scandeps(); + } + + return !@fail; + } + + sub setup_home { + my $self = shift; + + $self->{home} = $self->env('HOME') if $self->env('HOME'); + + unless (_writable($self->{home})) { + die "Can't write to cpanm home '$self->{home}': You should fix it with chown/chmod first.\n"; + } + + $self->{base} = "$self->{home}/work/" . time . ".$$"; + File::Path::mkpath([ $self->{base} ], 0, 0777); + + my $link = "$self->{home}/latest-build"; + eval { unlink $link; symlink $self->{base}, $link }; + + $self->{log} = File::Spec->catfile($self->{home}, "build.log"); # because we use shell redirect + + { + my $log = $self->{log}; my $base = $self->{base}; + $self->{at_exit} = sub { + my $self = shift; + File::Copy::copy($self->{log}, "$self->{base}/build.log"); + }; + } + + { open my $out, ">$self->{log}" or die "$self->{log}: $!" } + + $self->chat("cpanm (App::cpanminus) $VERSION on perl $] built for $Config{archname}\n" . + "Work directory is $self->{base}\n"); + } + + sub fetch_meta_sco { + my($self, $dist) = @_; + return if $self->{mirror_only}; + + my $meta_yml = $self->get("http://search.cpan.org/meta/$dist->{distvname}/META.yml"); + return $self->parse_meta_string($meta_yml); + } + + sub package_index_for { + my ($self, $mirror) = @_; + return $self->source_for($mirror) . "/02packages.details.txt"; + } + + sub generate_mirror_index { + my ($self, $mirror) = @_; + my $file = $self->package_index_for($mirror); + my $gz_file = $file . '.gz'; + my $index_mtime = (stat $gz_file)[9]; + + unless (-e $file && (stat $file)[9] >= $index_mtime) { + $self->chat("Uncompressing index file...\n"); + if (eval {require Compress::Zlib}) { + my $gz = Compress::Zlib::gzopen($gz_file, "rb") + or do { $self->diag_fail("$Compress::Zlib::gzerrno opening compressed index"); return}; + open my $fh, '>', $file + or do { $self->diag_fail("$! opening uncompressed index for write"); return }; + my $buffer; + while (my $status = $gz->gzread($buffer)) { + if ($status < 0) { + $self->diag_fail($gz->gzerror . " reading compressed index"); + return; + } + print $fh $buffer; + } + } else { + if (system("gunzip -c $gz_file > $file")) { + $self->diag_fail("Cannot uncompress -- please install gunzip or Compress::Zlib"); + return; + } + } + utime $index_mtime, $index_mtime, $file; + } + return 1; + } + + sub search_mirror_index { + my ($self, $mirror, $module, $version) = @_; + $self->search_mirror_index_file($self->package_index_for($mirror), $module, $version); + } + + sub search_mirror_index_file { + my($self, $file, $module, $version) = @_; + + open my $fh, '<', $file or return; + my $found; + while (<$fh>) { + if (m!^\Q$module\E\s+([\w\.]+)\s+(.*)!m) { + $found = $self->cpan_module($module, $2, $1); + last; + } + } + + return $found unless $self->{cascade_search}; + + if ($found) { + if (!$version or + version->new($found->{version} || 0) >= version->new($version)) { + return $found; + } else { + $self->chat("Found $module version $found->{version} < $version.\n"); + } + } + + return; + } + + sub search_module { + my($self, $module, $version) = @_; + + unless ($self->{mirror_only}) { + if ($self->{metacpan}) { + require JSON::PP; + $self->chat("Searching $module on metacpan ...\n"); + my $module_uri = "http://api.metacpan.org/module/$module"; + my $module_json = $self->get($module_uri); + my $module_meta = eval { JSON::PP::decode_json($module_json) }; + if ($module_meta && $module_meta->{distribution}) { + my $dist_uri = "http://api.metacpan.org/release/$module_meta->{distribution}"; + my $dist_json = $self->get($dist_uri); + my $dist_meta = eval { JSON::PP::decode_json($dist_json) }; + if ($dist_meta && $dist_meta->{download_url}) { + (my $distfile = $dist_meta->{download_url}) =~ s!.+/authors/id/!!; + local $self->{mirrors} = $self->{mirrors}; + if ($dist_meta->{stat}->{mtime} > time()-24*60*60) { + $self->{mirrors} = ['http://cpan.metacpan.org']; + } + return $self->cpan_module($module, $distfile, $dist_meta->{version}); + } + } + $self->diag_fail("Finding $module on metacpan failed."); + } + + $self->chat("Searching $module on cpanmetadb ...\n"); + my $uri = "http://cpanmetadb.plackperl.org/v1.0/package/$module"; + my $yaml = $self->get($uri); + my $meta = $self->parse_meta_string($yaml); + if ($meta && $meta->{distfile}) { + return $self->cpan_module($module, $meta->{distfile}, $meta->{version}); + } + + $self->diag_fail("Finding $module on cpanmetadb failed."); + + $self->chat("Searching $module on search.cpan.org ...\n"); + my $uri = "http://search.cpan.org/perldoc?$module"; + my $html = $self->get($uri); + $html =~ m!<a href="/CPAN/authors/id/(.*?\.(?:tar\.gz|tgz|tar\.bz2|zip))">! + and return $self->cpan_module($module, $1); + + $self->diag_fail("Finding $module on search.cpan.org failed."); + } + + if ($self->{mirror_index}) { + $self->chat("Searching $module on mirror index $self->{mirror_index} ...\n"); + my $pkg = $self->search_mirror_index_file($self->{mirror_index}, $module, $version); + return $pkg if $pkg; + } + + MIRROR: for my $mirror (@{ $self->{mirrors} }) { + $self->chat("Searching $module on mirror $mirror ...\n"); + my $name = '02packages.details.txt.gz'; + my $uri = "$mirror/modules/$name"; + my $gz_file = $self->package_index_for($mirror) . '.gz'; + + unless ($self->{pkgs}{$uri}) { + $self->chat("Downloading index file $uri ...\n"); + $self->mirror($uri, $gz_file); + $self->generate_mirror_index($mirror) or next MIRROR; + $self->{pkgs}{$uri} = "!!retrieved!!"; + } + + my $pkg = $self->search_mirror_index($mirror, $module, $version); + return $pkg if $pkg; + + $self->diag_fail("Finding $module ($version) on mirror $mirror failed."); + } + + return; + } + + sub source_for { + my($self, $mirror) = @_; + $mirror =~ s/[^\w\.\-]+/%/g; + + my $dir = "$self->{home}/sources/$mirror"; + File::Path::mkpath([ $dir ], 0, 0777); + + return $dir; + } + + sub load_argv_from_fh { + my($self, $fh) = @_; + + my @argv; + while(defined(my $line = <$fh>)){ + chomp $line; + $line =~ s/#.+$//; # comment + $line =~ s/^\s+//; # trim spaces + $line =~ s/\s+$//; # trim spaces + + push @argv, split ' ', $line if $line; + } + return @argv; + } + + sub show_version { + print "cpanm (App::cpanminus) version $VERSION\n"; + return 1; + } + + sub show_help { + my $self = shift; + + if ($_[0]) { + die <<USAGE; + Usage: cpanm [options] Module [...] + + Try `cpanm --help` or `man cpanm` for more options. + USAGE + } + + print <<HELP; + Usage: cpanm [options] Module [...] + + Options: + -v,--verbose Turns on chatty output + -q,--quiet Turns off the most output + --interactive Turns on interactive configure (required for Task:: modules) + -f,--force force install + -n,--notest Do not run unit tests + -S,--sudo sudo to run install commands + --installdeps Only install dependencies + --showdeps Only display direct dependencies + --reinstall Reinstall the distribution even if you already have the latest version installed + --mirror Specify the base URL for the mirror (e.g. http://cpan.cpantesters.org/) + --mirror-only Use the mirror's index file instead of the CPAN Meta DB + --prompt Prompt when configure/build/test fails + -l,--local-lib Specify the install base to install modules + -L,--local-lib-contained Specify the install base to install all non-core modules + --auto-cleanup Number of days that cpanm's work directories expire in. Defaults to 7 + + Commands: + --self-upgrade upgrades itself + --info Displays distribution info on CPAN + --look Opens the distribution with your SHELL + -V,--version Displays software version + + Examples: + + cpanm Test::More # install Test::More + cpanm MIYAGAWA/Plack-0.99_05.tar.gz # full distribution path + cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz # install from URL + cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz # install from a local file + cpanm --interactive Task::Kensho # Configure interactively + cpanm . # install from local directory + cpanm --installdeps . # install all the deps for the current directory + cpanm -L extlib Plack # install Plack and all non-core deps into extlib + cpanm --mirror http://cpan.cpantesters.org/ DBI # use the fast-syncing mirror + + You can also specify the default options in PERL_CPANM_OPT environment variable in the shell rc: + + export PERL_CPANM_OPT="--prompt --reinstall -l ~/perl --mirror http://cpan.cpantesters.org" + + Type `man cpanm` or `perldoc cpanm` for the more detailed explanation of the options. + + HELP + + return 1; + } + + sub _writable { + my $dir = shift; + my @dir = File::Spec->splitdir($dir); + while (@dir) { + $dir = File::Spec->catdir(@dir); + if (-e $dir) { + return -w _; + } + pop @dir; + } + + return; + } + + sub maybe_abs { + my($self, $lib) = @_; + return $lib if $lib eq '_'; # special case: gh-113 + $lib =~ /^[~\/]/ ? $lib : File::Spec->canonpath(Cwd::cwd . "/$lib"); + } + + sub bootstrap_local_lib { + my $self = shift; + + # If -l is specified, use that. + if ($self->{local_lib}) { + return $self->setup_local_lib($self->{local_lib}); + } + + # root, locally-installed perl or --sudo: don't care about install_base + return if $self->{sudo} or (_writable($Config{installsitelib}) and _writable($Config{installsitebin})); + + # local::lib is configured in the shell -- yay + if ($ENV{PERL_MM_OPT} and ($ENV{MODULEBUILDRC} or $ENV{PERL_MB_OPT})) { + $self->bootstrap_local_lib_deps; + return; + } + + $self->setup_local_lib; + + $self->diag(<<DIAG); + ! + ! Can't write to $Config{installsitelib} and $Config{installsitebin}: Installing modules to $ENV{HOME}/perl5 + ! To turn off this warning, you have to do one of the following: + ! - run me as a root or with --sudo option (to install to $Config{installsitelib} and $Config{installsitebin}) + | - run me with --local-lib option e.g. cpanm --local-lib=~/perl5 + ! - Set PERL_CPANM_OPT="--local-lib=~/perl5" environment variable (in your shell rc file) + ! - Configure local::lib in your shell to set PERL_MM_OPT etc. + ! + DIAG + sleep 2; + } + + sub _core_only_inc { + my($self, $base) = @_; + require local::lib; + ( + local::lib->install_base_perl_path($base), + local::lib->install_base_arch_path($base), + @Config{qw(privlibexp archlibexp)}, + ); + } + + sub _diff { + my($self, $old, $new) = @_; + + my @diff; + my %old = map { $_ => 1 } @$old; + for my $n (@$new) { + push @diff, $n unless exists $old{$n}; + } + + @diff; + } + + sub _setup_local_lib_env { + my($self, $base) = @_; + local $SIG{__WARN__} = sub { }; # catch 'Attempting to write ...' + local::lib->setup_env_hash_for($base); + } + + sub setup_local_lib { + my($self, $base) = @_; + $base = undef if $base eq '_'; + + require local::lib; + { + local $0 = 'cpanm'; # so curl/wget | perl works + $base ||= "~/perl5"; + if ($self->{self_contained}) { + my @inc = $self->_core_only_inc($base); + $self->{search_inc} = [ @inc ]; + } else { + $self->{search_inc} = [ + local::lib->install_base_arch_path($base), + local::lib->install_base_perl_path($base), + @INC, + ]; + } + $self->_setup_local_lib_env($base); + } + + $self->bootstrap_local_lib_deps; + } + + sub bootstrap_local_lib_deps { + my $self = shift; + push @{$self->{bootstrap_deps}}, + 'ExtUtils::MakeMaker' => 6.31, + 'ExtUtils::Install' => 1.46; + } + + sub prompt_bool { + my($self, $mess, $def) = @_; + + my $val = $self->prompt($mess, $def); + return lc $val eq 'y'; + } + + sub prompt { + my($self, $mess, $def) = @_; + + my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; + my $dispdef = defined $def ? "[$def] " : " "; + $def = defined $def ? $def : ""; + + if (!$self->{prompt} || (!$isa_tty && eof STDIN)) { + return $def; + } + + local $|=1; + local $\; + my $ans; + eval { + local $SIG{ALRM} = sub { undef $ans; die "alarm\n" }; + print STDOUT "$mess $dispdef"; + alarm $self->{prompt_timeout} if $self->{prompt_timeout}; + $ans = <STDIN>; + alarm 0; + }; + if ( defined $ans ) { + chomp $ans; + } else { # user hit ctrl-D or alarm timeout + print STDOUT "\n"; + } + + return (!defined $ans || $ans eq '') ? $def : $ans; + } + + sub diag_ok { + my($self, $msg) = @_; + chomp $msg; + $msg ||= "OK"; + if ($self->{in_progress}) { + $self->_diag("$msg\n"); + $self->{in_progress} = 0; + } + $self->log("-> $msg\n"); + } + + sub diag_fail { + my($self, $msg, $always) = @_; + chomp $msg; + if ($self->{in_progress}) { + $self->_diag("FAIL\n"); + $self->{in_progress} = 0; + } + + if ($msg) { + $self->_diag("! $msg\n", $always); + $self->log("-> FAIL $msg\n"); + } + } + + sub diag_progress { + my($self, $msg) = @_; + chomp $msg; + $self->{in_progress} = 1; + $self->_diag("$msg ... "); + $self->log("$msg\n"); + } + + sub _diag { + my($self, $msg, $always) = @_; + print STDERR $msg if $always or $self->{verbose} or !$self->{quiet}; + } + + sub diag { + my($self, $msg, $always) = @_; + $self->_diag($msg, $always); + $self->log($msg); + } + + sub chat { + my $self = shift; + print STDERR @_ if $self->{verbose}; + $self->log(@_); + } + + sub log { + my $self = shift; + open my $out, ">>$self->{log}"; + print $out @_; + } + + sub run { + my($self, $cmd) = @_; + + if (WIN32 && ref $cmd eq 'ARRAY') { + $cmd = join q{ }, map { $self->shell_quote($_) } @$cmd; + } + + if (ref $cmd eq 'ARRAY') { + my $pid = fork; + if ($pid) { + waitpid $pid, 0; + return !$?; + } else { + $self->run_exec($cmd); + } + } else { + unless ($self->{verbose}) { + $cmd .= " >> " . $self->shell_quote($self->{log}) . " 2>&1"; + } + !system $cmd; + } + } + + sub run_exec { + my($self, $cmd) = @_; + + if (ref $cmd eq 'ARRAY') { + unless ($self->{verbose}) { + open my $logfh, ">>", $self->{log}; + open STDERR, '>&', $logfh; + open STDOUT, '>&', $logfh; + close $logfh; + } + exec @$cmd; + } else { + unless ($self->{verbose}) { + $cmd .= " >> " . $self->shell_quote($self->{log}) . " 2>&1"; + } + exec $cmd; + } + } + + sub run_timeout { + my($self, $cmd, $timeout) = @_; + return $self->run($cmd) if WIN32 || $self->{verbose} || !$timeout; + + my $pid = fork; + if ($pid) { + eval { + local $SIG{ALRM} = sub { die "alarm\n" }; + alarm $timeout; + waitpid $pid, 0; + alarm 0; + }; + if ($@ && $@ eq "alarm\n") { + $self->diag_fail("Timed out (> ${timeout}s). Use --verbose to retry."); + local $SIG{TERM} = 'IGNORE'; + kill TERM => 0; + waitpid $pid, 0; + return; + } + return !$?; + } elsif ($pid == 0) { + $self->run_exec($cmd); + } else { + $self->chat("! fork failed: falling back to system()\n"); + $self->run($cmd); + } + } + + sub configure { + my($self, $cmd) = @_; + + # trick AutoInstall + local $ENV{PERL5_CPAN_IS_RUNNING} = local $ENV{PERL5_CPANPLUS_IS_RUNNING} = $$; + + # e.g. skip CPAN configuration on local::lib + local $ENV{PERL5_CPANM_IS_RUNNING} = $$; + + my $use_default = !$self->{interactive}; + local $ENV{PERL_MM_USE_DEFAULT} = $use_default; + + # skip man page generation + local $ENV{PERL_MM_OPT} = $ENV{PERL_MM_OPT}; + unless ($self->{pod2man}) { + $ENV{PERL_MM_OPT} .= " INSTALLMAN1DIR=none INSTALLMAN3DIR=none"; + } + + local $self->{verbose} = $self->{verbose} || $self->{interactive}; + $self->run_timeout($cmd, $self->{configure_timeout}); + } + + sub build { + my($self, $cmd, $distname) = @_; + + return 1 if $self->run_timeout($cmd, $self->{build_timeout}); + while (1) { + my $ans = lc $self->prompt("Building $distname failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?", "s"); + return if $ans eq 's'; + return $self->build($cmd, $distname) if $ans eq 'r'; + $self->show_build_log if $ans eq 'e'; + $self->look if $ans eq 'l'; + } + } + + sub test { + my($self, $cmd, $distname) = @_; + return 1 if $self->{notest}; + + # https://rt.cpan.org/Ticket/Display.html?id=48965#txn-1013385 + local $ENV{PERL_MM_USE_DEFAULT} = 1; + + return 1 if $self->run_timeout($cmd, $self->{test_timeout}); + if ($self->{force}) { + $self->diag_fail("Testing $distname failed but installing it anyway."); + return 1; + } else { + $self->diag_fail; + while (1) { + my $ans = lc $self->prompt("Testing $distname failed.\nYou can s)kip, r)etry, f)orce install, e)xamine build log, or l)ook ?", "s"); + return if $ans eq 's'; + return $self->test($cmd, $distname) if $ans eq 'r'; + return 1 if $ans eq 'f'; + $self->show_build_log if $ans eq 'e'; + $self->look if $ans eq 'l'; + } + } + } + + sub install { + my($self, $cmd, $uninst_opts) = @_; + + if ($self->{sudo}) { + unshift @$cmd, "sudo"; + } + + if ($self->{uninstall_shadows} && !$ENV{PERL_MM_OPT}) { + push @$cmd, @$uninst_opts; + } + + $self->run($cmd); + } + + sub look { + my $self = shift; + + my $shell = $ENV{SHELL}; + $shell ||= $ENV{COMSPEC} if WIN32; + if ($shell) { + my $cwd = Cwd::cwd; + $self->diag("Entering $cwd with $shell\n"); + system $shell; + } else { + $self->diag_fail("You don't seem to have a SHELL :/"); + } + } + + sub show_build_log { + my $self = shift; + + my @pagers = ( + $ENV{PAGER}, + (WIN32 ? () : ('less')), + 'more' + ); + my $pager; + while (@pagers) { + $pager = shift @pagers; + next unless $pager; + $pager = $self->which($pager); + next unless $pager; + last; + } + + if ($pager) { + # win32 'more' doesn't allow "more build.log", the < is required + system("$pager < $self->{log}"); + } + else { + $self->diag_fail("You don't seem to have a PAGER :/"); + } + } + + sub chdir { + my $self = shift; + Cwd::chdir(File::Spec->canonpath($_[0])) or die "$_[0]: $!"; + } + + sub configure_mirrors { + my $self = shift; + unless (@{$self->{mirrors}}) { + $self->{mirrors} = [ 'http://search.cpan.org/CPAN' ]; + } + for (@{$self->{mirrors}}) { + s!^/!file:///!; + s!/$!!; + } + } + + sub self_upgrade { + my $self = shift; + $self->{argv} = [ 'App::cpanminus' ]; + return; # continue + } + + sub install_module { + my($self, $module, $depth, $version) = @_; + + if ($self->{seen}{$module}++) { + $self->chat("Already tried $module. Skipping.\n"); + return 1; + } + + my $dist = $self->resolve_name($module, $version); + unless ($dist) { + $self->diag_fail("Couldn't find module or a distribution $module ($version)", 1); + return; + } + + if ($dist->{distvname} && $self->{seen}{$dist->{distvname}}++) { + $self->chat("Already tried $dist->{distvname}. Skipping.\n"); + return 1; + } + + if ($self->{cmd} eq 'info') { + print $self->format_dist($dist), "\n"; + return 1; + } + + $self->check_libs; + $self->setup_module_build_patch unless $self->{pod2man}; + + if ($dist->{module}) { + my($ok, $local) = $self->check_module($dist->{module}, $dist->{module_version} || 0); + if ($self->{skip_installed} && $ok) { + $self->diag("$dist->{module} is up to date. ($local)\n", 1); + return 1; + } + } + + if ($dist->{dist} eq 'perl'){ + $self->diag("skipping $dist->{pathname}\n"); + return 1; + } + + $self->diag("--> Working on $module\n"); + + $dist->{dir} ||= $self->fetch_module($dist); + + unless ($dist->{dir}) { + $self->diag_fail("Failed to fetch distribution $dist->{distvname}", 1); + return; + } + + $self->chat("Entering $dist->{dir}\n"); + $self->chdir($self->{base}); + $self->chdir($dist->{dir}); + + if ($self->{cmd} eq 'look') { + $self->look; + return 1; + } + + return $self->build_stuff($module, $dist, $depth); + } + + sub format_dist { + my($self, $dist) = @_; + + # TODO support --dist-format? + return "$dist->{cpanid}/$dist->{filename}"; + } + + sub fetch_module { + my($self, $dist) = @_; + + $self->chdir($self->{base}); + + for my $uri (@{$dist->{uris}}) { + $self->diag_progress("Fetching $uri"); + + # Ugh, $dist->{filename} can contain sub directory + my $filename = $dist->{filename} || $uri; + my $name = File::Basename::basename($filename); + + my $cancelled; + my $fetch = sub { + my $file; + eval { + local $SIG{INT} = sub { $cancelled = 1; die "SIGINT\n" }; + $self->mirror($uri, $name); + $file = $name if -e $name; + }; + $self->chat("$@") if $@ && $@ ne "SIGINT\n"; + return $file; + }; + + my($try, $file); + while ($try++ < 3) { + $file = $fetch->(); + last if $cancelled or $file; + $self->diag_fail("Download $uri failed. Retrying ... "); + } + + if ($cancelled) { + $self->diag_fail("Download cancelled."); + return; + } + + unless ($file) { + $self->diag_fail("Failed to download $uri"); + next; + } + + $self->diag_ok; + $dist->{local_path} = File::Spec->rel2abs($name); + + my $dir = $self->unpack($file); + next unless $dir; # unpack failed + + if (my $save = $self->{save_dists}) { + my $path = "$save/authors/id/$dist->{pathname}"; + $self->chat("Copying $name to $path\n"); + File::Path::mkpath([ File::Basename::dirname($path) ], 0, 0777); + File::Copy::copy($file, $path) or warn $!; + } + + return $dist, $dir; + } + } + + sub unpack { + my($self, $file) = @_; + $self->chat("Unpacking $file\n"); + my $dir = $file =~ /\.zip/i ? $self->unzip($file) : $self->untar($file); + unless ($dir) { + $self->diag_fail("Failed to unpack $file: no directory"); + } + return $dir; + } + + sub resolve_name { + my($self, $module, $version) = @_; + + # URL + if ($module =~ /^(ftp|https?|file):/) { + if ($module =~ m!authors/id/!) { + return $self->cpan_dist($module, $module); + } else { + return { uris => [ $module ] }; + } + } + + # Directory + if ($module =~ m!^[\./]! && -d $module) { + return { + source => 'local', + dir => Cwd::abs_path($module), + }; + } + + # File + if (-f $module) { + return { + source => 'local', + uris => [ "file://" . Cwd::abs_path($module) ], + }; + } + + # cpan URI + if ($module =~ s!^cpan:///distfile/!!) { + return $self->cpan_dist($module); + } + + # PAUSEID/foo + if ($module =~ m!([A-Z]{3,})/!) { + return $self->cpan_dist($module); + } + + # Module name + return $self->search_module($module, $version); + } + + sub cpan_module { + my($self, $module, $dist, $version) = @_; + + my $dist = $self->cpan_dist($dist); + $dist->{module} = $module; + $dist->{module_version} = $version if $version && $version ne 'undef'; + + return $dist; + } + + sub cpan_dist { + my($self, $dist, $url) = @_; + + $dist =~ s!^([A-Z]{3})!substr($1,0,1)."/".substr($1,0,2)."/".$1!e; + + require CPAN::DistnameInfo; + my $d = CPAN::DistnameInfo->new($dist); + + if ($url) { + $url = [ $url ] unless ref $url eq 'ARRAY'; + } else { + my $id = $d->cpanid; + my $fn = substr($id, 0, 1) . "/" . substr($id, 0, 2) . "/" . $id . "/" . $d->filename; + + my @mirrors = @{$self->{mirrors}}; + my @urls = map "$_/authors/id/$fn", @mirrors; + + $url = \@urls, + } + + return { + $d->properties, + source => 'cpan', + uris => $url, + }; + } + + sub setup_module_build_patch { + my $self = shift; + + open my $out, ">$self->{base}/ModuleBuildSkipMan.pm" or die $!; + print $out <<EOF; + package ModuleBuildSkipMan; + CHECK { + if (%Module::Build::) { + no warnings 'redefine'; + *Module::Build::Base::ACTION_manpages = sub {}; + *Module::Build::Base::ACTION_docs = sub {}; + } + } + 1; + EOF + } + + sub check_module { + my($self, $mod, $want_ver) = @_; + + require Module::Metadata; + my $meta = Module::Metadata->new_from_module($mod, inc => $self->{search_inc}) + or return 0, undef; + + my $version = $meta->version; + + # When -L is in use, the version loaded from 'perl' library path + # might be newer than (or actually wasn't core at) the version + # that is shipped with the current perl + if ($self->{self_contained} && $self->loaded_from_perl_lib($meta)) { + require Module::CoreList; + unless (exists $Module::CoreList::version{$]+0}{$mod}) { + return 0, undef; + } + $version = $Module::CoreList::version{$]+0}{$mod}; + } + + $self->{local_versions}{$mod} = $version; + + if ($self->is_deprecated($meta)){ + return 0, $version; + } elsif (!$want_ver or $version >= version->new($want_ver)) { + return 1, ($version || 'undef'); + } else { + return 0, $version; + } + } + + sub is_deprecated { + my($self, $meta) = @_; + + my $deprecated = eval { + require Module::CoreList; + Module::CoreList::is_deprecated($meta->{module}); + }; + + return unless $deprecated; + return $self->loaded_from_perl_lib($meta); + } + + sub loaded_from_perl_lib { + my($self, $meta) = @_; + + require Config; + for my $dir (qw(archlibexp privlibexp)) { + my $confdir = $Config{$dir}; + if ($confdir eq substr($meta->filename, 0, length($confdir))) { + return 1; + } + } + + return; + } + + sub should_install { + my($self, $mod, $ver) = @_; + + $self->chat("Checking if you have $mod $ver ... "); + my($ok, $local) = $self->check_module($mod, $ver); + + if ($ok) { $self->chat("Yes ($local)\n") } + elsif ($local) { $self->chat("No ($local < $ver)\n") } + else { $self->chat("No\n") } + + return $mod unless $ok; + return; + } + + sub install_deps { + my($self, $dir, $depth, @deps) = @_; + + my(@install, %seen); + while (my($mod, $ver) = splice @deps, 0, 2) { + next if $seen{$mod} or $mod eq 'perl' or $mod eq 'Config'; + if ($self->should_install($mod, $ver)) { + push @install, [ $mod, $ver ]; + $seen{$mod} = 1; + } + } + + if (@install) { + $self->diag("==> Found dependencies: " . join(", ", map $_->[0], @install) . "\n"); + } + + my @fail; + for my $mod (@install) { + $self->install_module($mod->[0], $depth + 1, $mod->[1]) + or push @fail, $mod->[0]; + } + + $self->chdir($self->{base}); + $self->chdir($dir) if $dir; + + return @fail; + } + + sub install_deps_bailout { + my($self, $target, $dir, $depth, @deps) = @_; + + my @fail = $self->install_deps($dir, $depth, @deps); + if (@fail) { + unless ($self->prompt_bool("Installing the following dependencies failed:\n==> " . + join(", ", @fail) . "\nDo you want to continue building $target anyway?", "n")) { + $self->diag_fail("Bailing out the installation for $target. Retry with --prompt or --force.", 1); + return; + } + } + + return 1; + } + + sub build_stuff { + my($self, $stuff, $dist, $depth) = @_; + + my @config_deps; + if (!%{$dist->{meta} || {}} && -e 'META.yml') { + $self->chat("Checking configure dependencies from META.yml\n"); + $dist->{meta} = $self->parse_meta('META.yml'); + } + + if (!$dist->{meta} && $dist->{source} eq 'cpan') { + $self->chat("META.yml not found or unparsable. Fetching META.yml from search.cpan.org\n"); + $dist->{meta} = $self->fetch_meta_sco($dist); + } + + $dist->{meta} ||= {}; + + push @config_deps, %{$dist->{meta}{configure_requires} || {}}; + + my $target = $dist->{meta}{name} ? "$dist->{meta}{name}-$dist->{meta}{version}" : $dist->{dir}; + + $self->install_deps_bailout($target, $dist->{dir}, $depth, @config_deps) + or return; + + $self->diag_progress("Configuring $target"); + + my $configure_state = $self->configure_this($dist); + + $self->diag_ok($configure_state->{configured_ok} ? "OK" : "N/A"); + + my @deps = $self->find_prereqs($dist); + my $module_name = $self->find_module_name($configure_state) || $dist->{meta}{name}; + $module_name =~ s/-/::/g; + + if ($self->{showdeps}) { + my %rootdeps = (@config_deps, @deps); # merge + for my $mod (keys %rootdeps) { + my $ver = $rootdeps{$mod}; + print $mod, ($ver ? "~$ver" : ""), "\n"; + } + return 1; + } + + my $distname = $dist->{meta}{name} ? "$dist->{meta}{name}-$dist->{meta}{version}" : $stuff; + + my $walkup; + if ($self->{scandeps}) { + $walkup = $self->scandeps_append_child($dist); + } + + $self->install_deps_bailout($distname, $dist->{dir}, $depth, @deps) + or return; + + if ($self->{scandeps}) { + unless ($configure_state->{configured_ok}) { + my $diag = <<DIAG; + ! Configuring $distname failed. See $self->{log} for details. + ! You might have to install the following modules first to get --scandeps working correctly. + DIAG + if (@config_deps) { + my @tree = @{$self->{scandeps_tree}}; + $diag .= "!\n" . join("", map "! * $_->[0]{module}\n", @tree[0..$#tree-1]) if @tree; + } + $self->diag("!\n$diag!\n", 1); + } + $walkup->(); + return 1; + } + + if ($self->{installdeps} && $depth == 0) { + if ($configure_state->{configured_ok}) { + $self->diag("<== Installed dependencies for $stuff. Finishing.\n"); + return 1; + } else { + $self->diag("! Configuring $distname failed. See $self->{log} for details.\n", 1); + return; + } + } + + my $installed; + if ($configure_state->{use_module_build} && -e 'Build' && -f _) { + my @switches = $self->{pod2man} ? () : ("-I$self->{base}", "-MModuleBuildSkipMan"); + $self->diag_progress("Building " . ($self->{notest} ? "" : "and testing ") . $distname); + $self->build([ $self->{perl}, @switches, "./Build" ], $distname) && + $self->test([ $self->{perl}, "./Build", "test" ], $distname) && + $self->install([ $self->{perl}, @switches, "./Build", "install" ], [ "--uninst", 1 ]) && + $installed++; + } elsif ($self->{make} && -e 'Makefile') { + $self->diag_progress("Building " . ($self->{notest} ? "" : "and testing ") . $distname); + $self->build([ $self->{make} ], $distname) && + $self->test([ $self->{make}, "test" ], $distname) && + $self->install([ $self->{make}, "install" ], [ "UNINST=1" ]) && + $installed++; + } else { + my $why; + my $configure_failed = $configure_state->{configured} && !$configure_state->{configured_ok}; + if ($configure_failed) { $why = "Configure failed for $distname." } + elsif ($self->{make}) { $why = "The distribution doesn't have a proper Makefile.PL/Build.PL" } + else { $why = "Can't configure the distribution. You probably need to have 'make'." } + + $self->diag_fail("$why See $self->{log} for details.", 1); + return; + } + + if ($installed) { + my $local = $self->{local_versions}{$dist->{module} || ''}; + my $version = $dist->{module_version} || $dist->{meta}{version} || $dist->{version}; + my $reinstall = $local && ($local eq $version); + + my $how = $reinstall ? "reinstalled $distname" + : $local ? "installed $distname (upgraded from $local)" + : "installed $distname" ; + my $msg = "Successfully $how"; + $self->diag_ok; + $self->diag("$msg\n", 1); + $self->{installed_dists}++; + $self->save_meta($stuff, $dist, $module_name, \@config_deps, \@deps); + return 1; + } else { + my $msg = "Building $distname failed"; + $self->diag_fail("Installing $stuff failed. See $self->{log} for details.", 1); + return; + } + } + + sub configure_this { + my($self, $dist) = @_; + + if ($self->{skip_configure}) { + my $eumm = -e 'Makefile'; + my $mb = -e 'Build' && -f _; + return { + configured => 1, + configured_ok => $eumm || $mb, + use_module_build => $mb, + }; + } + + my @mb_switches; + unless ($self->{pod2man}) { + # it has to be push, so Module::Build is loaded from the adjusted path when -L is in use + push @mb_switches, ("-I$self->{base}", "-MModuleBuildSkipMan"); + } + + my $state = {}; + + my $try_eumm = sub { + if (-e 'Makefile.PL') { + $self->chat("Running Makefile.PL\n"); + + # NOTE: according to Devel::CheckLib, most XS modules exit + # with 0 even if header files are missing, to avoid receiving + # tons of FAIL reports in such cases. So exit code can't be + # trusted if it went well. + if ($self->configure([ $self->{perl}, "Makefile.PL" ])) { + $state->{configured_ok} = -e 'Makefile'; + } + $state->{configured}++; + } + }; + + my $try_mb = sub { + if (-e 'Build.PL') { + $self->chat("Running Build.PL\n"); + if ($self->configure([ $self->{perl}, @mb_switches, "Build.PL" ])) { + $state->{configured_ok} = -e 'Build' && -f _; + } + $state->{use_module_build}++; + $state->{configured}++; + } + }; + + # Module::Build deps should use MakeMaker because that causes circular deps and fail + # Otherwise we should prefer Build.PL + my %should_use_mm = map { $_ => 1 } qw( version ExtUtils-ParseXS ExtUtils-Install ExtUtils-Manifest ); + + my @try; + if ($dist->{dist} && $should_use_mm{$dist->{dist}}) { + @try = ($try_eumm, $try_mb); + } else { + @try = ($try_mb, $try_eumm); + } + + for my $try (@try) { + $try->(); + last if $state->{configured_ok}; + } + + unless ($state->{configured_ok}) { + while (1) { + my $ans = lc $self->prompt("Configuring $dist->{dist} failed.\nYou can s)kip, r)etry, e)xamine build log, or l)ook ?", "s"); + last if $ans eq 's'; + return $self->configure_this($dist) if $ans eq 'r'; + $self->show_build_log if $ans eq 'e'; + $self->look if $ans eq 'l'; + } + } + + return $state; + } + + sub find_module_name { + my($self, $state) = @_; + + return unless $state->{configured_ok}; + + if ($state->{use_module_build} && + -e "_build/build_params") { + my $params = do { open my $in, "_build/build_params"; $self->safe_eval(join "", <$in>) }; + return eval { $params->[2]{module_name} } || undef; + } elsif (-e "Makefile") { + open my $mf, "Makefile"; + while (<$mf>) { + if (/^\#\s+NAME\s+=>\s+(.*)/) { + return $self->safe_eval($1); + } + } + } + + return; + } + + sub save_meta { + my($self, $module, $dist, $module_name, $config_deps, $build_deps) = @_; + + return unless $dist->{distvname} && $dist->{source} eq 'cpan'; + + my $base = ($ENV{PERL_MM_OPT} || '') =~ /INSTALL_BASE=/ + ? ($self->install_base($ENV{PERL_MM_OPT}) . "/lib/perl5") : $Config{sitelibexp}; + + my $provides = $self->_merge_hashref( + map Module::Metadata->package_versions_from_directory($_), + qw( blib/lib blib/arch ) # FCGI.pm :( + ); + + mkdir "blib/meta", 0777 or die $!; + + my $local = { + name => $module_name, + module => $module, + version => $provides->{$module}{version} || $dist->{version}, + dist => $dist->{distvname}, + pathname => $dist->{pathname}, + provides => $provides, + }; + + require JSON::PP; + open my $fh, ">", "blib/meta/install.json" or die $!; + print $fh JSON::PP::encode_json($local); + + # Existence of MYMETA.* Depends on EUMM/M::B versions and CPAN::Meta + if (-e "MYMETA.json") { + File::Copy::copy("MYMETA.json", "blib/meta/MYMETA.json"); + } + + my @cmd = ( + ($self->{sudo} ? 'sudo' : ()), + $^X, + '-MExtUtils::Install=install', + '-e', + qq[install({ 'blib/meta' => '$base/$Config{archname}/.meta/$dist->{distvname}' })], + ); + $self->run(\@cmd); + } + + sub _merge_hashref { + my($self, @hashrefs) = @_; + + my %hash; + for my $h (@hashrefs) { + %hash = (%hash, %$h); + } + + return \%hash; + } + + sub install_base { + my($self, $mm_opt) = @_; + $mm_opt =~ /INSTALL_BASE=(\S+)/ and return $1; + die "Your PERL_MM_OPT doesn't contain INSTALL_BASE"; + } + + sub safe_eval { + my($self, $code) = @_; + eval $code; + } + + sub find_prereqs { + my($self, $dist) = @_; + + my @deps = $self->extract_meta_prereqs($dist); + + if ($dist->{module} =~ /^Bundle::/i) { + push @deps, $self->bundle_deps($dist); + } + + return @deps; + } + + sub extract_meta_prereqs { + my($self, $dist) = @_; + + my $meta = $dist->{meta}; + + my @deps; + if (-e "MYMETA.json") { + require JSON::PP; + $self->chat("Checking dependencies from MYMETA.json ...\n"); + my $json = do { open my $in, "<MYMETA.json"; local $/; <$in> }; + my $mymeta = JSON::PP::decode_json($json); + if ($mymeta) { + $meta->{$_} = $mymeta->{$_} for qw(name version); + return $self->extract_requires($mymeta); + } + } + + if (-e 'MYMETA.yml') { + $self->chat("Checking dependencies from MYMETA.yml ...\n"); + my $mymeta = $self->parse_meta('MYMETA.yml'); + if ($mymeta) { + $meta->{$_} = $mymeta->{$_} for qw(name version); + return $self->extract_requires($mymeta); + } + } + + if (-e '_build/prereqs') { + $self->chat("Checking dependencies from _build/prereqs ...\n"); + my $mymeta = do { open my $in, "_build/prereqs"; $self->safe_eval(join "", <$in>) }; + @deps = $self->extract_requires($mymeta); + } elsif (-e 'Makefile') { + $self->chat("Finding PREREQ from Makefile ...\n"); + open my $mf, "Makefile"; + while (<$mf>) { + if (/^\#\s+PREREQ_PM => {\s*(.*?)\s*}/) { + my @all; + my @pairs = split ', ', $1; + for (@pairs) { + my ($pkg, $v) = split '=>', $_; + push @all, [ $pkg, $v ]; + } + my $list = join ", ", map { "'$_->[0]' => $_->[1]" } @all; + my $prereq = $self->safe_eval("no strict; +{ $list }"); + push @deps, %$prereq if $prereq; + last; + } + } + } + + return @deps; + } + + sub bundle_deps { + my($self, $dist) = @_; + + my @files; + File::Find::find({ + wanted => sub { push @files, File::Spec->rel2abs($_) if /\.pm/i }, + no_chdir => 1, + }, '.'); + + my @deps; + + for my $file (@files) { + open my $pod, "<", $file or next; + my $in_contents; + while (<$pod>) { + if (/^=head\d\s+CONTENTS/) { + $in_contents = 1; + } elsif (/^=/) { + $in_contents = 0; + } elsif ($in_contents) { + /^(\S+)\s*(\S+)?/ + and push @deps, $1, $self->maybe_version($2); + } + } + } + + return @deps; + } + + sub maybe_version { + my($self, $string) = @_; + return $string && $string =~ /^\.?\d/ ? $string : undef; + } + + sub extract_requires { + my($self, $meta) = @_; + + if ($meta->{'meta-spec'} && $meta->{'meta-spec'}{version} == 2) { + my @phase = $self->{notest} ? qw( build runtime ) : qw( build test runtime ); + my @deps = map { + my $p = $meta->{prereqs}{$_} || {}; + %{$p->{requires} || {}}; + } @phase; + return @deps; + } + + my @deps; + push @deps, %{$meta->{build_requires}} if $meta->{build_requires}; + push @deps, %{$meta->{requires}} if $meta->{requires}; + + return @deps; + } + + sub cleanup_workdirs { + my $self = shift; + + my $expire = time - 24 * 60 * 60 * $self->{auto_cleanup}; + my @targets; + + opendir my $dh, "$self->{home}/work"; + while (my $e = readdir $dh) { + next if $e !~ /^(\d+)\.\d+$/; # {UNIX time}.{PID} + my $time = $1; + if ($time < $expire) { + push @targets, "$self->{home}/work/$e"; + } + } + + if (@targets) { + $self->chat("Expiring ", scalar(@targets), " work directories.\n"); + File::Path::rmtree(\@targets, 0, 0); # safe = 0, since blib usually doesn't have write bits + } + } + + sub scandeps_append_child { + my($self, $dist) = @_; + + my $new_node = [ $dist, [] ]; + + my $curr_node = $self->{scandeps_current} || [ undef, $self->{scandeps_tree} ]; + push @{$curr_node->[1]}, $new_node; + + $self->{scandeps_current} = $new_node; + + return sub { $self->{scandeps_current} = $curr_node }; + } + + sub dump_scandeps { + my $self = shift; + + if ($self->{format} eq 'tree') { + $self->walk_down(sub { + my($dist, $depth) = @_; + if ($depth == 0) { + print "$dist->{distvname}\n"; + } else { + print " " x ($depth - 1); + print "\\_ $dist->{distvname}\n"; + } + }, 1); + } elsif ($self->{format} =~ /^dists?$/) { + $self->walk_down(sub { + my($dist, $depth) = @_; + print $self->format_dist($dist), "\n"; + }, 0); + } elsif ($self->{format} eq 'json') { + require JSON::PP; + print JSON::PP::encode_json($self->{scandeps_tree}); + } elsif ($self->{format} eq 'yaml') { + require YAML; + print YAML::Dump($self->{scandeps_tree}); + } else { + $self->diag("Unknown format: $self->{format}\n"); + } + } + + sub walk_down { + my($self, $cb, $pre) = @_; + $self->_do_walk_down($self->{scandeps_tree}, $cb, 0, $pre); + } + + sub _do_walk_down { + my($self, $children, $cb, $depth, $pre) = @_; + + # DFS - $pre determines when we call the callback + for my $node (@$children) { + $cb->($node->[0], $depth) if $pre; + $self->_do_walk_down($node->[1], $cb, $depth + 1, $pre); + $cb->($node->[0], $depth) unless $pre; + } + } + + sub DESTROY { + my $self = shift; + $self->{at_exit}->($self) if $self->{at_exit}; + } + + # Utils + + sub shell_quote { + my($self, $stuff) = @_; + $stuff =~ /^${quote}.+${quote}$/ ? $stuff : ($quote . $stuff . $quote); + } + + sub which { + my($self, $name) = @_; + my $exe_ext = $Config{_exe}; + for my $dir (File::Spec->path) { + my $fullpath = File::Spec->catfile($dir, $name); + if (-x $fullpath || -x ($fullpath .= $exe_ext)) { + if ($fullpath =~ /\s/ && $fullpath !~ /^$quote/) { + $fullpath = $self->shell_quote($fullpath); + } + return $fullpath; + } + } + return; + } + + sub get { $_[0]->{_backends}{get}->(@_) }; + sub mirror { $_[0]->{_backends}{mirror}->(@_) }; + sub untar { $_[0]->{_backends}{untar}->(@_) }; + sub unzip { $_[0]->{_backends}{unzip}->(@_) }; + + sub file_get { + my($self, $uri) = @_; + open my $fh, "<$uri" or return; + join '', <$fh>; + } + + sub file_mirror { + my($self, $uri, $path) = @_; + File::Copy::copy($uri, $path); + } + + sub init_tools { + my $self = shift; + + return if $self->{initialized}++; + + if ($self->{make} = $self->which($Config{make})) { + $self->chat("You have make $self->{make}\n"); + } + + # use --no-lwp if they have a broken LWP, to upgrade LWP + if ($self->{try_lwp} && eval { require LWP::UserAgent; LWP::UserAgent->VERSION(5.802) }) { + $self->chat("You have LWP $LWP::VERSION\n"); + my $ua = sub { + LWP::UserAgent->new( + parse_head => 0, + env_proxy => 1, + agent => "cpanminus/$VERSION", + timeout => 30, + @_, + ); + }; + $self->{_backends}{get} = sub { + my $self = shift; + my $res = $ua->()->request(HTTP::Request->new(GET => $_[0])); + return unless $res->is_success; + return $res->decoded_content; + }; + $self->{_backends}{mirror} = sub { + my $self = shift; + my $res = $ua->()->mirror(@_); + $res->code; + }; + } elsif ($self->{try_wget} and my $wget = $self->which('wget')) { + $self->chat("You have $wget\n"); + $self->{_backends}{get} = sub { + my($self, $uri) = @_; + return $self->file_get($uri) if $uri =~ s!^file:/+!/!; + $self->safeexec( my $fh, $wget, $uri, ( $self->{verbose} ? () : '-q' ), '-O', '-' ) or die "wget $uri: $!"; + local $/; + <$fh>; + }; + $self->{_backends}{mirror} = sub { + my($self, $uri, $path) = @_; + return $self->file_mirror($uri, $path) if $uri =~ s!^file:/+!/!; + $self->safeexec( my $fh, $wget, '--retry-connrefused', $uri, ( $self->{verbose} ? () : '-q' ), '-O', $path ) or die "wget $uri: $!"; + local $/; + <$fh>; + }; + } elsif ($self->{try_curl} and my $curl = $self->which('curl')) { + $self->chat("You have $curl\n"); + $self->{_backends}{get} = sub { + my($self, $uri) = @_; + return $self->file_get($uri) if $uri =~ s!^file:/+!/!; + $self->safeexec( my $fh, $curl, '-L', ( $self->{verbose} ? () : '-s' ), $uri ) or die "curl $uri: $!"; + local $/; + <$fh>; + }; + $self->{_backends}{mirror} = sub { + my($self, $uri, $path) = @_; + return $self->file_mirror($uri, $path) if $uri =~ s!^file:/+!/!; + $self->safeexec( my $fh, $curl, '-L', $uri, ( $self->{verbose} ? () : '-s' ), '-#', '-o', $path ) or die "curl $uri: $!"; + local $/; + <$fh>; + }; + } else { + require HTTP::Tiny; + $self->chat("Falling back to HTTP::Tiny $HTTP::Tiny::VERSION\n"); + + $self->{_backends}{get} = sub { + my $self = shift; + my $res = HTTP::Tiny->new->get($_[0]); + return unless $res->{success}; + return $res->{content}; + }; + $self->{_backends}{mirror} = sub { + my $self = shift; + my $res = HTTP::Tiny->new->mirror(@_); + return $res->{status}; + }; + } + + my $tar = $self->which('tar'); + my $tar_ver; + my $maybe_bad_tar = sub { WIN32 || SUNOS || (($tar_ver = `$tar --version 2>/dev/null`) =~ /GNU.*1\.13/i) }; + + if ($tar && !$maybe_bad_tar->()) { + chomp $tar_ver; + $self->chat("You have $tar: $tar_ver\n"); + $self->{_backends}{untar} = sub { + my($self, $tarfile) = @_; + + my $xf = "xf" . ($self->{verbose} ? 'v' : ''); + my $ar = $tarfile =~ /bz2$/ ? 'j' : 'z'; + + my($root, @others) = `$tar tf$ar $tarfile` + or return undef; + + chomp $root; + $root =~ s!^\./!!; + $root =~ s{^(.+?)/.*$}{$1}; + + system "$tar $xf$ar $tarfile"; + return $root if -d $root; + + $self->diag_fail("Bad archive: $tarfile"); + return undef; + } + } elsif ( $tar + and my $gzip = $self->which('gzip') + and my $bzip2 = $self->which('bzip2')) { + $self->chat("You have $tar, $gzip and $bzip2\n"); + $self->{_backends}{untar} = sub { + my($self, $tarfile) = @_; + + my $x = "x" . ($self->{verbose} ? 'v' : '') . "f -"; + my $ar = $tarfile =~ /bz2$/ ? $bzip2 : $gzip; + + my($root, @others) = `$ar -dc $tarfile | $tar tf -` + or return undef; + + chomp $root; + $root =~ s{^(.+?)/.*$}{$1}; + + system "$ar -dc $tarfile | $tar $x"; + return $root if -d $root; + + $self->diag_fail("Bad archive: $tarfile"); + return undef; + } + } elsif (eval { require Archive::Tar }) { # uses too much memory! + $self->chat("Falling back to Archive::Tar $Archive::Tar::VERSION\n"); + $self->{_backends}{untar} = sub { + my $self = shift; + my $t = Archive::Tar->new($_[0]); + my $root = ($t->list_files)[0]; + $root =~ s{^(.+?)/.*$}{$1}; + $t->extract; + return -d $root ? $root : undef; + }; + } else { + $self->{_backends}{untar} = sub { + die "Failed to extract $_[1] - You need to have tar or Archive::Tar installed.\n"; + }; + } + + if (my $unzip = $self->which('unzip')) { + $self->chat("You have $unzip\n"); + $self->{_backends}{unzip} = sub { + my($self, $zipfile) = @_; + + my $opt = $self->{verbose} ? '' : '-q'; + my(undef, $root, @others) = `$unzip -t $zipfile` + or return undef; + + chomp $root; + $root =~ s{^\s+testing:\s+(.+?)/\s+OK$}{$1}; + + system "$unzip $opt $zipfile"; + return $root if -d $root; + + $self->diag_fail("Bad archive: [$root] $zipfile"); + return undef; + } + } else { + $self->{_backends}{unzip} = sub { + eval { require Archive::Zip } + or die "Failed to extract $_[1] - You need to have unzip or Archive::Zip installed.\n"; + my($self, $file) = @_; + my $zip = Archive::Zip->new(); + my $status; + $status = $zip->read($file); + $self->diag_fail("Read of file[$file] failed") + if $status != Archive::Zip::AZ_OK(); + my @members = $zip->members(); + my $root; + for my $member ( @members ) { + my $af = $member->fileName(); + next if ($af =~ m!^(/|\.\./)!); + $root = $af unless $root; + $status = $member->extractToFileNamed( $af ); + $self->diag_fail("Extracting of file[$af] from zipfile[$file failed") + if $status != Archive::Zip::AZ_OK(); + } + return -d $root ? $root : undef; + }; + } + } + + sub safeexec { + my $self = shift; + my $rdr = $_[0] ||= Symbol::gensym(); + + if (WIN32) { + my $cmd = join q{ }, map { $self->shell_quote($_) } @_[ 1 .. $#_ ]; + return open( $rdr, "$cmd |" ); + } + + if ( my $pid = open( $rdr, '-|' ) ) { + return $pid; + } + elsif ( defined $pid ) { + exec( @_[ 1 .. $#_ ] ); + exit 1; + } + else { + return; + } + } + + sub parse_meta { + my($self, $file) = @_; + return eval { (Parse::CPAN::Meta::LoadFile($file))[0] } || undef; + } + + sub parse_meta_string { + my($self, $yaml) = @_; + return eval { (Parse::CPAN::Meta::Load($yaml))[0] } || undef; + } + + 1; +APP_CPANMINUS_SCRIPT + +$fatpacked{"CPAN/DistnameInfo.pm"} = <<'CPAN_DISTNAMEINFO'; + + package CPAN::DistnameInfo; + + $VERSION = "0.11"; + use strict; + + sub distname_info { + my $file = shift or return; + + my ($dist, $version) = $file =~ /^ + ((?:[-+.]*(?:[A-Za-z0-9]+|(?<=\D)_|_(?=\D))* + (?: + [A-Za-z](?=[^A-Za-z]|$) + | + \d(?=-) + )(?<![._-][vV]) + )+)(.*) + $/xs or return ($file,undef,undef); + + if ($dist =~ /-undef\z/ and ! length $version) { + $dist =~ s/-undef\z//; + } + + # Remove potential -withoutworldwriteables suffix + $version =~ s/-withoutworldwriteables$//; + + if ($version =~ /^(-[Vv].*)-(\d.*)/) { + + # Catch names like Unicode-Collate-Standard-V3_1_1-0.1 + # where the V3_1_1 is part of the distname + $dist .= $1; + $version = $2; + } + + # Normalize the Dist.pm-1.23 convention which CGI.pm and + # a few others use. + $dist =~ s{\.pm$}{}; + + $version = $1 + if !length $version and $dist =~ s/-(\d+\w)$//; + + $version = $1 . $version + if $version =~ /^\d+$/ and $dist =~ s/-(\w+)$//; + + if ($version =~ /\d\.\d/) { + $version =~ s/^[-_.]+//; + } + else { + $version =~ s/^[-_]+//; + } + + my $dev; + if (length $version) { + if ($file =~ /^perl-?\d+\.(\d+)(?:\D(\d+))?(-(?:TRIAL|RC)\d+)?$/) { + $dev = 1 if (($1 > 6 and $1 & 1) or ($2 and $2 >= 50)) or $3; + } + elsif ($version =~ /\d\D\d+_\d/ or $version =~ /-TRIAL/) { + $dev = 1; + } + } + else { + $version = undef; + } + + ($dist, $version, $dev); + } + + sub new { + my $class = shift; + my $distfile = shift; + + $distfile =~ s,//+,/,g; + + my %info = ( pathname => $distfile ); + + ($info{filename} = $distfile) =~ s,^(((.*?/)?authors/)?id/)?([A-Z])/(\4[A-Z])/(\5[-A-Z0-9]*)/,, + and $info{cpanid} = $6; + + if ($distfile =~ m,([^/]+)\.(tar\.(?:g?z|bz2)|zip|tgz)$,i) { # support more ? + $info{distvname} = $1; + $info{extension} = $2; + } + + @info{qw(dist version beta)} = distname_info($info{distvname}); + $info{maturity} = delete $info{beta} ? 'developer' : 'released'; + + return bless \%info, $class; + } + + sub dist { shift->{dist} } + sub version { shift->{version} } + sub maturity { shift->{maturity} } + sub filename { shift->{filename} } + sub cpanid { shift->{cpanid} } + sub distvname { shift->{distvname} } + sub extension { shift->{extension} } + sub pathname { shift->{pathname} } + + sub properties { %{ $_[0] } } + + 1; + + __END__ + +CPAN_DISTNAMEINFO + +$fatpacked{"CPAN/Meta.pm"} = <<'CPAN_META'; + use 5.006; + use strict; + use warnings; + package CPAN::Meta; + BEGIN { + $CPAN::Meta::VERSION = '2.110930'; + } + # ABSTRACT: the distribution metadata for a CPAN dist + + + use Carp qw(carp croak); + use CPAN::Meta::Feature; + use CPAN::Meta::Prereqs; + use CPAN::Meta::Converter; + use CPAN::Meta::Validator; + use Parse::CPAN::Meta 1.4400 (); + + sub _dclone { + my $ref = shift; + my $backend = Parse::CPAN::Meta->json_backend(); + return $backend->new->decode( + $backend->new->convert_blessed->encode($ref) + ); + } + + + BEGIN { + my @STRING_READERS = qw( + abstract + description + dynamic_config + generated_by + name + release_status + version + ); + + no strict 'refs'; + for my $attr (@STRING_READERS) { + *$attr = sub { $_[0]{ $attr } }; + } + } + + + BEGIN { + my @LIST_READERS = qw( + author + keywords + license + ); + + no strict 'refs'; + for my $attr (@LIST_READERS) { + *$attr = sub { + my $value = $_[0]{ $attr }; + croak "$attr must be called in list context" + unless wantarray; + return @{ _dclone($value) } if ref $value; + return $value; + }; + } + } + + sub authors { $_[0]->author } + sub licenses { $_[0]->license } + + + BEGIN { + my @MAP_READERS = qw( + meta-spec + resources + provides + no_index + + prereqs + optional_features + ); + + no strict 'refs'; + for my $attr (@MAP_READERS) { + (my $subname = $attr) =~ s/-/_/; + *$subname = sub { + my $value = $_[0]{ $attr }; + return _dclone($value) if $value; + return {}; + }; + } + } + + + sub custom_keys { + return grep { /^x_/i } keys %{$_[0]}; + } + + sub custom { + my ($self, $attr) = @_; + my $value = $self->{$attr}; + return _dclone($value) if ref $value; + return $value; + } + + + sub _new { + my ($class, $struct, $options) = @_; + my $self; + + if ( $options->{lazy_validation} ) { + # try to convert to a valid structure; if succeeds, then return it + my $cmc = CPAN::Meta::Converter->new( $struct ); + $self = $cmc->convert( version => 2 ); # valid or dies + return bless $self, $class; + } + else { + # validate original struct + my $cmv = CPAN::Meta::Validator->new( $struct ); + unless ( $cmv->is_valid) { + die "Invalid metadata structure. Errors: " + . join(", ", $cmv->errors) . "\n"; + } + } + + # up-convert older spec versions + my $version = $struct->{'meta-spec'}{version} || '1.0'; + if ( $version == 2 ) { + $self = $struct; + } + else { + my $cmc = CPAN::Meta::Converter->new( $struct ); + $self = $cmc->convert( version => 2 ); + } + + return bless $self, $class; + } + + sub new { + my ($class, $struct, $options) = @_; + my $self = eval { $class->_new($struct, $options) }; + croak($@) if $@; + return $self; + } + + + sub create { + my ($class, $struct, $options) = @_; + my $version = __PACKAGE__->VERSION || 2; + $struct->{generated_by} ||= __PACKAGE__ . " version $version" ; + $struct->{'meta-spec'}{version} ||= int($version); + my $self = eval { $class->_new($struct, $options) }; + croak ($@) if $@; + return $self; + } + + + sub load_file { + my ($class, $file, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + croak "load_file() requires a valid, readable filename" + unless -r $file; + + my $self; + eval { + my $struct = Parse::CPAN::Meta->load_file( $file ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; + } + + + sub load_yaml_string { + my ($class, $yaml, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + my $self; + eval { + my ($struct) = Parse::CPAN::Meta->load_yaml_string( $yaml ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; + } + + + sub load_json_string { + my ($class, $json, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + my $self; + eval { + my $struct = Parse::CPAN::Meta->load_json_string( $json ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; + } + + + sub save { + my ($self, $file, $options) = @_; + + my $version = $options->{version} || '2'; + my $layer = $] ge '5.008001' ? ':utf8' : ''; + + if ( $version ge '2' ) { + carp "'$file' should end in '.json'" + unless $file =~ m{\.json$}; + } + else { + carp "'$file' should end in '.yml'" + unless $file =~ m{\.yml$}; + } + + my $data = $self->as_string( $options ); + open my $fh, ">$layer", $file + or die "Error opening '$file' for writing: $!\n"; + + print {$fh} $data; + close $fh + or die "Error closing '$file': $!\n"; + + return 1; + } + + + sub meta_spec_version { + my ($self) = @_; + return $self->meta_spec->{version}; + } + + + sub effective_prereqs { + my ($self, $features) = @_; + $features ||= []; + + my $prereq = CPAN::Meta::Prereqs->new($self->prereqs); + + return $prereq unless @$features; + + my @other = map {; $self->feature($_)->prereqs } @$features; + + return $prereq->with_merged_prereqs(\@other); + } + + + sub should_index_file { + my ($self, $filename) = @_; + + for my $no_index_file (@{ $self->no_index->{file} || [] }) { + return if $filename eq $no_index_file; + } + + for my $no_index_dir (@{ $self->no_index->{directory} }) { + $no_index_dir =~ s{$}{/} unless $no_index_dir =~ m{/\z}; + return if index($filename, $no_index_dir) == 0; + } + + return 1; + } + + + sub should_index_package { + my ($self, $package) = @_; + + for my $no_index_pkg (@{ $self->no_index->{package} || [] }) { + return if $package eq $no_index_pkg; + } + + for my $no_index_ns (@{ $self->no_index->{namespace} }) { + return if index($package, "${no_index_ns}::") == 0; + } + + return 1; + } + + + sub features { + my ($self) = @_; + + my $opt_f = $self->optional_features; + my @features = map {; CPAN::Meta::Feature->new($_ => $opt_f->{ $_ }) } + keys %$opt_f; + + return @features; + } + + + sub feature { + my ($self, $ident) = @_; + + croak "no feature named $ident" + unless my $f = $self->optional_features->{ $ident }; + + return CPAN::Meta::Feature->new($ident, $f); + } + + + sub as_struct { + my ($self, $options) = @_; + my $struct = _dclone($self); + if ( $options->{version} ) { + my $cmc = CPAN::Meta::Converter->new( $struct ); + $struct = $cmc->convert( version => $options->{version} ); + } + return $struct; + } + + + sub as_string { + my ($self, $options) = @_; + + my $version = $options->{version} || '2'; + + my $struct; + if ( $self->meta_spec_version ne $version ) { + my $cmc = CPAN::Meta::Converter->new( $self->as_struct ); + $struct = $cmc->convert( version => $version ); + } + else { + $struct = $self->as_struct; + } + + my ($data, $backend); + if ( $version ge '2' ) { + $backend = Parse::CPAN::Meta->json_backend(); + $data = $backend->new->pretty->canonical->encode($struct); + } + else { + $backend = Parse::CPAN::Meta->yaml_backend(); + $data = eval { no strict 'refs'; &{"$backend\::Dump"}($struct) }; + if ( $@ ) { + croak $backend->can('errstr') ? $backend->errstr : $@ + } + } + + return $data; + } + + # Used by JSON::PP, etc. for "convert_blessed" + sub TO_JSON { + return { %{ $_[0] } }; + } + + 1; + + + + + __END__ + + +CPAN_META + +$fatpacked{"CPAN/Meta/Converter.pm"} = <<'CPAN_META_CONVERTER'; + use 5.006; + use strict; + use warnings; + package CPAN::Meta::Converter; + BEGIN { + $CPAN::Meta::Converter::VERSION = '2.110930'; + } + # ABSTRACT: Convert CPAN distribution metadata structures + + + use CPAN::Meta::Validator; + use version 0.82 (); + use Parse::CPAN::Meta 1.4400 (); + + sub _dclone { + my $ref = shift; + my $backend = Parse::CPAN::Meta->json_backend(); + return $backend->new->decode( + $backend->new->convert_blessed->encode($ref) + ); + } + + my %known_specs = ( + '2' => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec', + '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html', + '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html', + '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html', + '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html', + '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html' + ); + + my @spec_list = sort { $a <=> $b } keys %known_specs; + my ($LOWEST, $HIGHEST) = @spec_list[0,-1]; + + #--------------------------------------------------------------------------# + # converters + # + # called as $converter->($element, $field_name, $full_meta, $to_version) + # + # defined return value used for field + # undef return value means field is skipped + #--------------------------------------------------------------------------# + + sub _keep { $_[0] } + + sub _keep_or_one { defined($_[0]) ? $_[0] : 1 } + + sub _keep_or_zero { defined($_[0]) ? $_[0] : 0 } + + sub _keep_or_unknown { defined($_[0]) && length($_[0]) ? $_[0] : "unknown" } + + sub _generated_by { + my $gen = shift; + my $sig = __PACKAGE__ . " version " . (__PACKAGE__->VERSION || "<dev>"); + + return $sig unless defined $gen and length $gen; + return $gen if $gen =~ /(, )\Q$sig/; + return "$gen, $sig"; + } + + sub _listify { ! defined $_[0] ? undef : ref $_[0] eq 'ARRAY' ? $_[0] : [$_[0]] } + + sub _prefix_custom { + my $key = shift; + $key =~ s/^(?!x_) # Unless it already starts with x_ + (?:x-?)? # Remove leading x- or x (if present) + /x_/ix; # and prepend x_ + return $key; + } + + sub _ucfirst_custom { + my $key = shift; + $key = ucfirst $key unless $key =~ /[A-Z]/; + return $key; + } + + sub _change_meta_spec { + my ($element, undef, undef, $version) = @_; + $element->{version} = $version; + $element->{url} = $known_specs{$version}; + return $element; + } + + my @valid_licenses_1 = ( + 'perl', + 'gpl', + 'apache', + 'artistic', + 'artistic_2', + 'lgpl', + 'bsd', + 'gpl', + 'mit', + 'mozilla', + 'open_source', + 'unrestricted', + 'restrictive', + 'unknown', + ); + + my %license_map_1 = ( + ( map { $_ => $_ } @valid_licenses_1 ), + artistic2 => 'artistic_2', + ); + + sub _license_1 { + my ($element) = @_; + return 'unknown' unless defined $element; + if ( $license_map_1{lc $element} ) { + return $license_map_1{lc $element}; + } + return 'unknown'; + } + + my @valid_licenses_2 = qw( + agpl_3 + apache_1_1 + apache_2_0 + artistic_1 + artistic_2 + bsd + freebsd + gfdl_1_2 + gfdl_1_3 + gpl_1 + gpl_2 + gpl_3 + lgpl_2_1 + lgpl_3_0 + mit + mozilla_1_0 + mozilla_1_1 + openssl + perl_5 + qpl_1_0 + ssleay + sun + zlib + open_source + restricted + unrestricted + unknown + ); + + # The "old" values were defined by Module::Build, and were often vague. I have + # made the decisions below based on reading Module::Build::API and how clearly + # it specifies the version of the license. + my %license_map_2 = ( + (map { $_ => $_ } @valid_licenses_2), + apache => 'apache_2_0', # clearly stated as 2.0 + artistic => 'artistic_1', # clearly stated as 1 + artistic2 => 'artistic_2', # clearly stated as 2 + gpl => 'open_source', # we don't know which GPL; punt + lgpl => 'open_source', # we don't know which LGPL; punt + mozilla => 'open_source', # we don't know which MPL; punt + perl => 'perl_5', # clearly Perl 5 + restrictive => 'restricted', + ); + + sub _license_2 { + my ($element) = @_; + return [ 'unknown' ] unless defined $element; + $element = [ $element ] unless ref $element eq 'ARRAY'; + my @new_list; + for my $lic ( @$element ) { + next unless defined $lic; + if ( my $new = $license_map_2{lc $lic} ) { + push @new_list, $new; + } + } + return @new_list ? \@new_list : [ 'unknown' ]; + } + + my %license_downgrade_map = qw( + agpl_3 open_source + apache_1_1 apache + apache_2_0 apache + artistic_1 artistic + artistic_2 artistic_2 + bsd bsd + freebsd open_source + gfdl_1_2 open_source + gfdl_1_3 open_source + gpl_1 gpl + gpl_2 gpl + gpl_3 gpl + lgpl_2_1 lgpl + lgpl_3_0 lgpl + mit mit + mozilla_1_0 mozilla + mozilla_1_1 mozilla + openssl open_source + perl_5 perl + qpl_1_0 open_source + ssleay open_source + sun open_source + zlib open_source + open_source open_source + restricted restrictive + unrestricted unrestricted + unknown unknown + ); + + sub _downgrade_license { + my ($element) = @_; + if ( ! defined $element ) { + return "unknown"; + } + elsif( ref $element eq 'ARRAY' ) { + if ( @$element == 1 ) { + return $license_downgrade_map{$element->[0]} || "unknown"; + } + } + elsif ( ! ref $element ) { + return $license_downgrade_map{$element} || "unknown"; + } + return "unknown"; + } + + my $no_index_spec_1_2 = { + 'file' => \&_listify, + 'dir' => \&_listify, + 'package' => \&_listify, + 'namespace' => \&_listify, + }; + + my $no_index_spec_1_3 = { + 'file' => \&_listify, + 'directory' => \&_listify, + 'package' => \&_listify, + 'namespace' => \&_listify, + }; + + my $no_index_spec_2 = { + 'file' => \&_listify, + 'directory' => \&_listify, + 'package' => \&_listify, + 'namespace' => \&_listify, + ':custom' => \&_prefix_custom, + }; + + sub _no_index_1_2 { + my (undef, undef, $meta) = @_; + my $no_index = $meta->{no_index} || $meta->{private}; + return unless $no_index; + + # cleanup wrong format + if ( ! ref $no_index ) { + my $item = $no_index; + $no_index = { dir => [ $item ], file => [ $item ] }; + } + elsif ( ref $no_index eq 'ARRAY' ) { + my $list = $no_index; + $no_index = { dir => [ @$list ], file => [ @$list ] }; + } + + # common mistake: files -> file + if ( exists $no_index->{files} ) { + $no_index->{file} = delete $no_index->{file}; + } + # common mistake: modules -> module + if ( exists $no_index->{modules} ) { + $no_index->{module} = delete $no_index->{module}; + } + return _convert($no_index, $no_index_spec_1_2); + } + + sub _no_index_directory { + my ($element, $key, $meta, $version) = @_; + return unless $element; + + # cleanup wrong format + if ( ! ref $element ) { + my $item = $element; + $element = { directory => [ $item ], file => [ $item ] }; + } + elsif ( ref $element eq 'ARRAY' ) { + my $list = $element; + $element = { directory => [ @$list ], file => [ @$list ] }; + } + + if ( exists $element->{dir} ) { + $element->{directory} = delete $element->{dir}; + } + # common mistake: files -> file + if ( exists $element->{files} ) { + $element->{file} = delete $element->{file}; + } + # common mistake: modules -> module + if ( exists $element->{modules} ) { + $element->{module} = delete $element->{module}; + } + my $spec = $version == 2 ? $no_index_spec_2 : $no_index_spec_1_3; + return _convert($element, $spec); + } + + sub _is_module_name { + my $mod = shift; + return unless defined $mod && length $mod; + return $mod =~ m{^[A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z0-9_]+)*$}; + } + + sub _clean_version { + my ($element, $key, $meta, $to_version) = @_; + return 0 if ! defined $element; + + $element =~ s{^\s*}{}; + $element =~ s{\s*$}{}; + $element =~ s{^\.}{0.}; + + return 0 if ! length $element; + return 0 if ( $element eq 'undef' || $element eq '<undef>' ); + + if ( my $v = eval { version->new($element) } ) { + return $v->is_qv ? $v->normal : $element; + } + else { + return 0; + } + } + + sub _version_map { + my ($element) = @_; + return undef unless defined $element; + if ( ref $element eq 'HASH' ) { + my $new_map = {}; + for my $k ( keys %$element ) { + next unless _is_module_name($k); + my $value = $element->{$k}; + if ( ! ( defined $value && length $value ) ) { + $new_map->{$k} = 0; + } + elsif ( $value eq 'undef' || $value eq '<undef>' ) { + $new_map->{$k} = 0; + } + elsif ( _is_module_name( $value ) ) { # some weird, old META have this + $new_map->{$k} = 0; + $new_map->{$value} = 0; + } + else { + $new_map->{$k} = _clean_version($value); + } + } + return $new_map; + } + elsif ( ref $element eq 'ARRAY' ) { + my $hashref = { map { $_ => 0 } @$element }; + return _version_map($hashref); # cleanup any weird stuff + } + elsif ( ref $element eq '' && length $element ) { + return { $element => 0 } + } + return; + } + + sub _prereqs_from_1 { + my (undef, undef, $meta) = @_; + my $prereqs = {}; + for my $phase ( qw/build configure/ ) { + my $key = "${phase}_requires"; + $prereqs->{$phase}{requires} = _version_map($meta->{$key}) + if $meta->{$key}; + } + for my $rel ( qw/requires recommends conflicts/ ) { + $prereqs->{runtime}{$rel} = _version_map($meta->{$rel}) + if $meta->{$rel}; + } + return $prereqs; + } + + my $prereqs_spec = { + configure => \&_prereqs_rel, + build => \&_prereqs_rel, + test => \&_prereqs_rel, + runtime => \&_prereqs_rel, + develop => \&_prereqs_rel, + ':custom' => \&_prefix_custom, + }; + + my $relation_spec = { + requires => \&_version_map, + recommends => \&_version_map, + suggests => \&_version_map, + conflicts => \&_version_map, + ':custom' => \&_prefix_custom, + }; + + sub _cleanup_prereqs { + my ($prereqs, $key, $meta, $to_version) = @_; + return unless $prereqs && ref $prereqs eq 'HASH'; + return _convert( $prereqs, $prereqs_spec, $to_version ); + } + + sub _prereqs_rel { + my ($relation, $key, $meta, $to_version) = @_; + return unless $relation && ref $relation eq 'HASH'; + return _convert( $relation, $relation_spec, $to_version ); + } + + + BEGIN { + my @old_prereqs = qw( + requires + configure_requires + recommends + conflicts + ); + + for ( @old_prereqs ) { + my $sub = "_get_$_"; + my ($phase,$type) = split qr/_/, $_; + if ( ! defined $type ) { + $type = $phase; + $phase = 'runtime'; + } + no strict 'refs'; + *{$sub} = sub { _extract_prereqs($_[2]->{prereqs},$phase,$type) }; + } + } + + sub _get_build_requires { + my ($data, $key, $meta) = @_; + + my $test_h = _extract_prereqs($_[2]->{prereqs}, qw(test requires)) || {}; + my $build_h = _extract_prereqs($_[2]->{prereqs}, qw(build requires)) || {}; + + require Version::Requirements; + my $test_req = Version::Requirements->from_string_hash($test_h); + my $build_req = Version::Requirements->from_string_hash($build_h); + + $test_req->add_requirements($build_req)->as_string_hash; + } + + sub _extract_prereqs { + my ($prereqs, $phase, $type) = @_; + return unless ref $prereqs eq 'HASH'; + return $prereqs->{$phase}{$type}; + } + + sub _downgrade_optional_features { + my (undef, undef, $meta) = @_; + return undef unless exists $meta->{optional_features}; + my $origin = $meta->{optional_features}; + my $features = {}; + for my $name ( keys %$origin ) { + $features->{$name} = { + description => $origin->{$name}{description}, + requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','requires'), + configure_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','configure_requires'), + build_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','build_requires'), + recommends => _extract_prereqs($origin->{$name}{prereqs},'runtime','recommends'), + conflicts => _extract_prereqs($origin->{$name}{prereqs},'runtime','conflicts'), + }; + for my $k (keys %{$features->{$name}} ) { + delete $features->{$name}{$k} unless defined $features->{$name}{$k}; + } + } + return $features; + } + + sub _upgrade_optional_features { + my (undef, undef, $meta) = @_; + return undef unless exists $meta->{optional_features}; + my $origin = $meta->{optional_features}; + my $features = {}; + for my $name ( keys %$origin ) { + $features->{$name} = { + description => $origin->{$name}{description}, + prereqs => _prereqs_from_1(undef, undef, $origin->{$name}), + }; + delete $features->{$name}{prereqs}{configure}; + } + return $features; + } + + my $optional_features_2_spec = { + description => \&_keep, + prereqs => \&_cleanup_prereqs, + ':custom' => \&_prefix_custom, + }; + + sub _feature_2 { + my ($element, $key, $meta, $to_version) = @_; + return unless $element && ref $element eq 'HASH'; + _convert( $element, $optional_features_2_spec, $to_version ); + } + + sub _cleanup_optional_features_2 { + my ($element, $key, $meta, $to_version) = @_; + return unless $element && ref $element eq 'HASH'; + my $new_data = {}; + for my $k ( keys %$element ) { + $new_data->{$k} = _feature_2( $element->{$k}, $k, $meta, $to_version ); + } + return unless keys %$new_data; + return $new_data; + } + + sub _optional_features_1_4 { + my ($element) = @_; + return unless $element; + $element = _optional_features_as_map($element); + for my $name ( keys %$element ) { + for my $drop ( qw/requires_packages requires_os excluded_os/ ) { + delete $element->{$name}{$drop}; + } + } + return $element; + } + + sub _optional_features_as_map { + my ($element) = @_; + return unless $element; + if ( ref $element eq 'ARRAY' ) { + my %map; + for my $feature ( @$element ) { + my (@parts) = %$feature; + $map{$parts[0]} = $parts[1]; + } + $element = \%map; + } + return $element; + } + + sub _is_urlish { defined $_[0] && $_[0] =~ m{\A[-+.a-z0-9]+:.+}i } + + sub _url_or_drop { + my ($element) = @_; + return $element if _is_urlish($element); + return; + } + + sub _url_list { + my ($element) = @_; + return unless $element; + $element = _listify( $element ); + $element = [ grep { _is_urlish($_) } @$element ]; + return unless @$element; + return $element; + } + + sub _author_list { + my ($element) = @_; + return [ 'unknown' ] unless $element; + $element = _listify( $element ); + $element = [ map { defined $_ && length $_ ? $_ : 'unknown' } @$element ]; + return [ 'unknown' ] unless @$element; + return $element; + } + + my $resource2_upgrade = { + license => sub { return _is_urlish($_[0]) ? _listify( $_[0] ) : undef }, + homepage => \&_url_or_drop, + bugtracker => sub { + my ($item) = @_; + return unless $item; + if ( $item =~ m{^mailto:(.*)$} ) { return { mailto => $1 } } + elsif( _is_urlish($item) ) { return { web => $item } } + else { return undef } + }, + repository => sub { return _is_urlish($_[0]) ? { url => $_[0] } : undef }, + ':custom' => \&_prefix_custom, + }; + + sub _upgrade_resources_2 { + my (undef, undef, $meta, $version) = @_; + return undef unless exists $meta->{resources}; + return _convert($meta->{resources}, $resource2_upgrade); + } + + my $bugtracker2_spec = { + web => \&_url_or_drop, + mailto => \&_keep, + ':custom' => \&_prefix_custom, + }; + + sub _repo_type { + my ($element, $key, $meta, $to_version) = @_; + return $element if defined $element; + return unless exists $meta->{url}; + my $repo_url = $meta->{url}; + for my $type ( qw/git svn/ ) { + return $type if $repo_url =~ m{\A$type}; + } + return; + } + + my $repository2_spec = { + web => \&_url_or_drop, + url => \&_url_or_drop, + type => \&_repo_type, + ':custom' => \&_prefix_custom, + }; + + my $resources2_cleanup = { + license => \&_url_list, + homepage => \&_url_or_drop, + bugtracker => sub { ref $_[0] ? _convert( $_[0], $bugtracker2_spec ) : undef }, + repository => sub { my $data = shift; ref $data ? _convert( $data, $repository2_spec ) : undef }, + ':custom' => \&_prefix_custom, + }; + + sub _cleanup_resources_2 { + my ($resources, $key, $meta, $to_version) = @_; + return undef unless $resources && ref $resources eq 'HASH'; + return _convert($resources, $resources2_cleanup, $to_version); + } + + my $resource1_spec = { + license => \&_url_or_drop, + homepage => \&_url_or_drop, + bugtracker => \&_url_or_drop, + repository => \&_url_or_drop, + ':custom' => \&_keep, + }; + + sub _resources_1_3 { + my (undef, undef, $meta, $version) = @_; + return undef unless exists $meta->{resources}; + return _convert($meta->{resources}, $resource1_spec); + } + + *_resources_1_4 = *_resources_1_3; + + sub _resources_1_2 { + my (undef, undef, $meta) = @_; + my $resources = $meta->{resources} || {}; + if ( $meta->{license_url} && ! $resources->{license} ) { + $resources->{license} = $meta->license_url + if _is_urlish($meta->{license_url}); + } + return undef unless keys %$resources; + return _convert($resources, $resource1_spec); + } + + my $resource_downgrade_spec = { + license => sub { return ref $_[0] ? $_[0]->[0] : $_[0] }, + homepage => \&_url_or_drop, + bugtracker => sub { return $_[0]->{web} }, + repository => sub { return $_[0]->{url} || $_[0]->{web} }, + ':custom' => \&_ucfirst_custom, + }; + + sub _downgrade_resources { + my (undef, undef, $meta, $version) = @_; + return undef unless exists $meta->{resources}; + return _convert($meta->{resources}, $resource_downgrade_spec); + } + + sub _release_status { + my ($element, undef, $meta) = @_; + return $element if $element && $element =~ m{\A(?:stable|testing|unstable)\z}; + return _release_status_from_version(undef, undef, $meta); + } + + sub _release_status_from_version { + my (undef, undef, $meta) = @_; + my $version = $meta->{version} || ''; + return ( $version =~ /_/ ) ? 'testing' : 'stable'; + } + + my $provides_spec = { + file => \&_keep, + version => \&_clean_version, + }; + + my $provides_spec_2 = { + file => \&_keep, + version => \&_clean_version, + ':custom' => \&_prefix_custom, + }; + + sub _provides { + my ($element, $key, $meta, $to_version) = @_; + return unless defined $element && ref $element eq 'HASH'; + my $spec = $to_version == 2 ? $provides_spec_2 : $provides_spec; + my $new_data = {}; + for my $k ( keys %$element ) { + $new_data->{$k} = _convert($element->{$k}, $spec, $to_version); + } + return $new_data; + } + + sub _convert { + my ($data, $spec, $to_version) = @_; + + my $new_data = {}; + for my $key ( keys %$spec ) { + next if $key eq ':custom' || $key eq ':drop'; + next unless my $fcn = $spec->{$key}; + die "spec for '$key' is not a coderef" + unless ref $fcn && ref $fcn eq 'CODE'; + my $new_value = $fcn->($data->{$key}, $key, $data, $to_version); + $new_data->{$key} = $new_value if defined $new_value; + } + + my $drop_list = $spec->{':drop'}; + my $customizer = $spec->{':custom'} || \&_keep; + + for my $key ( keys %$data ) { + next if $drop_list && grep { $key eq $_ } @$drop_list; + next if exists $spec->{$key}; # we handled it + $new_data->{ $customizer->($key) } = $data->{$key}; + } + + return $new_data; + } + + #--------------------------------------------------------------------------# + # define converters for each conversion + #--------------------------------------------------------------------------# + + # each converts from prior version + # special ":custom" field is used for keys not recognized in spec + my %up_convert = ( + '2-from-1.4' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_2, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'dynamic_config' => \&_keep_or_one, + # ADDED MANDATORY + 'release_status' => \&_release_status_from_version, + # PRIOR OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_upgrade_optional_features, + 'provides' => \&_provides, + 'resources' => \&_upgrade_resources_2, + # ADDED OPTIONAL + 'description' => \&_keep, + 'prereqs' => \&_prereqs_from_1, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + build_requires + configure_requires + conflicts + distribution_type + license_url + private + recommends + requires + ) ], + + # other random keys need x_ prefixing + ':custom' => \&_prefix_custom, + }, + '1.4-from-1.3' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_1_4, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_4, + # ADDED OPTIONAL + 'configure_requires' => \&_keep, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + license_url + private + )], + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.3-from-1.2' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + license_url + private + )], + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.2-from-1.1' => { + # PRIOR MANDATORY + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'license' => \&_license_1, + 'name' => \&_keep, + 'generated_by' => \&_generated_by, + # ADDED MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'meta-spec' => \&_change_meta_spec, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_1_2, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'resources' => \&_resources_1_2, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + license_url + private + )], + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.1-from-1.0' => { + # CHANGED TO MANDATORY + 'version' => \&_keep, + # IMPLIED MANDATORY + 'name' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'license_url' => \&_url_or_drop, + 'private' => \&_keep, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + ); + + my %down_convert = ( + '1.4-from-2' => { + # MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_downgrade_license, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # OPTIONAL + 'build_requires' => \&_get_build_requires, + 'configure_requires' => \&_get_configure_requires, + 'conflicts' => \&_get_conflicts, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_downgrade_optional_features, + 'provides' => \&_provides, + 'recommends' => \&_get_recommends, + 'requires' => \&_get_requires, + 'resources' => \&_downgrade_resources, + + # drop these unsupported fields (after conversion) + ':drop' => [ qw( + description + prereqs + release_status + )], + + # custom keys will be left unchanged + ':custom' => \&_keep + }, + '1.3-from-1.4' => { + # MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # drop these unsupported fields, but only after we convert + ':drop' => [ qw( + configure_requires + )], + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + '1.2-from-1.3' => { + # MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_1_2, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + '1.1-from-1.2' => { + # MANDATORY + 'version' => \&_keep, + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + # OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'private' => \&_keep, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + + # drop unsupported fields + ':drop' => [ qw( + abstract + author + provides + no_index + keywords + resources + )], + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + '1.0-from-1.1' => { + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + ); + + my %cleanup = ( + '2' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_2, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'dynamic_config' => \&_keep_or_one, + # ADDED MANDATORY + 'release_status' => \&_release_status, + # PRIOR OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_cleanup_optional_features_2, + 'provides' => \&_provides, + 'resources' => \&_cleanup_resources_2, + # ADDED OPTIONAL + 'description' => \&_keep, + 'prereqs' => \&_cleanup_prereqs, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + build_requires + configure_requires + conflicts + distribution_type + license_url + private + recommends + requires + ) ], + + # other random keys need x_ prefixing + ':custom' => \&_prefix_custom, + }, + '1.4' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_1_4, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_4, + # ADDED OPTIONAL + 'configure_requires' => \&_keep, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.3' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.2' => { + # PRIOR MANDATORY + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'license' => \&_license_1, + 'name' => \&_keep, + 'generated_by' => \&_generated_by, + # ADDED MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'meta-spec' => \&_change_meta_spec, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_1_2, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'resources' => \&_resources_1_2, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.1' => { + # CHANGED TO MANDATORY + 'version' => \&_keep, + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'license_url' => \&_url_or_drop, + 'private' => \&_keep, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.0' => { + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + 'version' => \&_keep, + # IMPLIED OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + ); + + #--------------------------------------------------------------------------# + # Code + #--------------------------------------------------------------------------# + + + sub new { + my ($class,$data) = @_; + + # create an attributes hash + my $self = { + 'data' => $data, + 'spec' => $data->{'meta-spec'}{'version'} || "1.0", + }; + + # create the object + return bless $self, $class; + } + + + sub convert { + my ($self, %args) = @_; + my $args = { %args }; + + my $new_version = $args->{version} || $HIGHEST; + + my ($old_version) = $self->{spec}; + my $converted = _dclone($self->{data}); + + if ( $old_version == $new_version ) { + $converted = _convert( $converted, $cleanup{$old_version}, $old_version ); + my $cmv = CPAN::Meta::Validator->new( $converted ); + unless ( $cmv->is_valid ) { + my $errs = join("\n", $cmv->errors); + die "Failed to clean-up $old_version metadata. Errors:\n$errs\n"; + } + return $converted; + } + elsif ( $old_version > $new_version ) { + my @vers = sort { $b <=> $a } keys %known_specs; + for my $i ( 0 .. $#vers-1 ) { + next if $vers[$i] > $old_version; + last if $vers[$i+1] < $new_version; + my $spec_string = "$vers[$i+1]-from-$vers[$i]"; + $converted = _convert( $converted, $down_convert{$spec_string}, $vers[$i+1] ); + my $cmv = CPAN::Meta::Validator->new( $converted ); + unless ( $cmv->is_valid ) { + my $errs = join("\n", $cmv->errors); + die "Failed to downconvert metadata to $vers[$i+1]. Errors:\n$errs\n"; + } + } + return $converted; + } + else { + my @vers = sort { $a <=> $b } keys %known_specs; + for my $i ( 0 .. $#vers-1 ) { + next if $vers[$i] < $old_version; + last if $vers[$i+1] > $new_version; + my $spec_string = "$vers[$i+1]-from-$vers[$i]"; + $converted = _convert( $converted, $up_convert{$spec_string}, $vers[$i+1] ); + my $cmv = CPAN::Meta::Validator->new( $converted ); + unless ( $cmv->is_valid ) { + my $errs = join("\n", $cmv->errors); + die "Failed to upconvert metadata to $vers[$i+1]. Errors:\n$errs\n"; + } + } + return $converted; + } + } + + 1; + + + + + __END__ + + +CPAN_META_CONVERTER + +$fatpacked{"CPAN/Meta/Feature.pm"} = <<'CPAN_META_FEATURE'; + use 5.006; + use strict; + use warnings; + package CPAN::Meta::Feature; + BEGIN { + $CPAN::Meta::Feature::VERSION = '2.110930'; + } + # ABSTRACT: an optional feature provided by a CPAN distribution + + use CPAN::Meta::Prereqs; + + + sub new { + my ($class, $identifier, $spec) = @_; + + my %guts = ( + identifier => $identifier, + description => $spec->{description}, + prereqs => CPAN::Meta::Prereqs->new($spec->{prereqs}), + ); + + bless \%guts => $class; + } + + + sub identifier { $_[0]{identifier} } + + + sub description { $_[0]{description} } + + + sub prereqs { $_[0]{prereqs} } + + 1; + + + + + __END__ + + + +CPAN_META_FEATURE + +$fatpacked{"CPAN/Meta/History.pm"} = <<'CPAN_META_HISTORY'; + # vi:tw=72 + use 5.006; + use strict; + use warnings; + package CPAN::Meta::History; + BEGIN { + $CPAN::Meta::History::VERSION = '2.110930'; + } + # ABSTRACT: history of CPAN Meta Spec changes + 1; + + + + __END__ + =pod + +CPAN_META_HISTORY + +$fatpacked{"CPAN/Meta/Prereqs.pm"} = <<'CPAN_META_PREREQS'; + use 5.006; + use strict; + use warnings; + package CPAN::Meta::Prereqs; + BEGIN { + $CPAN::Meta::Prereqs::VERSION = '2.110930'; + } + # ABSTRACT: a set of distribution prerequisites by phase and type + + + use Carp qw(confess); + use Scalar::Util qw(blessed); + use Version::Requirements 0.101020; # finalize + + + sub __legal_phases { qw(configure build test runtime develop) } + sub __legal_types { qw(requires recommends suggests conflicts) } + + # expect a prereq spec from META.json -- rjbs, 2010-04-11 + sub new { + my ($class, $prereq_spec) = @_; + $prereq_spec ||= {}; + + my %is_legal_phase = map {; $_ => 1 } $class->__legal_phases; + my %is_legal_type = map {; $_ => 1 } $class->__legal_types; + + my %guts; + PHASE: for my $phase (keys %$prereq_spec) { + next PHASE unless $phase =~ /\Ax_/i or $is_legal_phase{$phase}; + + my $phase_spec = $prereq_spec->{ $phase }; + next PHASE unless keys %$phase_spec; + + TYPE: for my $type (keys %$phase_spec) { + next TYPE unless $type =~ /\Ax_/i or $is_legal_type{$type}; + + my $spec = $phase_spec->{ $type }; + + next TYPE unless keys %$spec; + + $guts{prereqs}{$phase}{$type} = Version::Requirements->from_string_hash( + $spec + ); + } + } + + return bless \%guts => $class; + } + + + sub requirements_for { + my ($self, $phase, $type) = @_; + + confess "requirements_for called without phase" unless defined $phase; + confess "requirements_for called without type" unless defined $type; + + unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) { + confess "requested requirements for unknown phase: $phase"; + } + + unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) { + confess "requested requirements for unknown type: $type"; + } + + my $req = ($self->{prereqs}{$phase}{$type} ||= Version::Requirements->new); + + $req->finalize if $self->is_finalized; + + return $req; + } + + + sub with_merged_prereqs { + my ($self, $other) = @_; + + my @other = blessed($other) ? $other : @$other; + + my @prereq_objs = ($self, @other); + + my %new_arg; + + for my $phase ($self->__legal_phases) { + for my $type ($self->__legal_types) { + my $req = Version::Requirements->new; + + for my $prereq (@prereq_objs) { + my $this_req = $prereq->requirements_for($phase, $type); + next unless $this_req->required_modules; + + $req->add_requirements($this_req); + } + + next unless $req->required_modules; + + $new_arg{ $phase }{ $type } = $req->as_string_hash; + } + } + + return (ref $self)->new(\%new_arg); + } + + + sub as_string_hash { + my ($self) = @_; + + my %hash; + + for my $phase ($self->__legal_phases) { + for my $type ($self->__legal_types) { + my $req = $self->requirements_for($phase, $type); + next unless $req->required_modules; + + $hash{ $phase }{ $type } = $req->as_string_hash; + } + } + + return \%hash; + } + + + sub is_finalized { $_[0]{finalized} } + + + sub finalize { + my ($self) = @_; + + $self->{finalized} = 1; + + for my $phase (keys %{ $self->{prereqs} }) { + $_->finalize for values %{ $self->{prereqs}{$phase} }; + } + } + + + sub clone { + my ($self) = @_; + + my $clone = (ref $self)->new( $self->as_string_hash ); + } + + 1; + + + + + __END__ + + + +CPAN_META_PREREQS + +$fatpacked{"CPAN/Meta/Spec.pm"} = <<'CPAN_META_SPEC'; + # vi:tw=72 + use 5.006; + use strict; + use warnings; + package CPAN::Meta::Spec; + BEGIN { + $CPAN::Meta::Spec::VERSION = '2.110930'; + } + # ABSTRACT: specification for CPAN distribution metadata + 1; + + + + __END__ + =pod + +CPAN_META_SPEC + +$fatpacked{"CPAN/Meta/Validator.pm"} = <<'CPAN_META_VALIDATOR'; + use 5.006; + use strict; + use warnings; + package CPAN::Meta::Validator; + BEGIN { + $CPAN::Meta::Validator::VERSION = '2.110930'; + } + # ABSTRACT: validate CPAN distribution metadata structures + + + #--------------------------------------------------------------------------# + # This code copied and adapted from Test::CPAN::Meta + # by Barbie, <barbie@cpan.org> for Miss Barbell Productions, + # L<http://www.missbarbell.co.uk> + #--------------------------------------------------------------------------# + + #--------------------------------------------------------------------------# + # Specification Definitions + #--------------------------------------------------------------------------# + + my %known_specs = ( + '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html', + '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html', + '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html', + '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html', + '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html' + ); + my %known_urls = map {$known_specs{$_} => $_} keys %known_specs; + + my $module_map1 = { 'map' => { ':key' => { name => \&module, value => \&exversion } } }; + + my $module_map2 = { 'map' => { ':key' => { name => \&module, value => \&version } } }; + + my $no_index_2 = { + 'map' => { file => { list => { value => \&string } }, + directory => { list => { value => \&string } }, + 'package' => { list => { value => \&string } }, + namespace => { list => { value => \&string } }, + ':key' => { name => \&custom_2, value => \&anything }, + } + }; + + my $no_index_1_3 = { + 'map' => { file => { list => { value => \&string } }, + directory => { list => { value => \&string } }, + 'package' => { list => { value => \&string } }, + namespace => { list => { value => \&string } }, + ':key' => { name => \&string, value => \&anything }, + } + }; + + my $no_index_1_2 = { + 'map' => { file => { list => { value => \&string } }, + dir => { list => { value => \&string } }, + 'package' => { list => { value => \&string } }, + namespace => { list => { value => \&string } }, + ':key' => { name => \&string, value => \&anything }, + } + }; + + my $no_index_1_1 = { + 'map' => { ':key' => { name => \&string, list => { value => \&string } }, + } + }; + + my $prereq_map = { + map => { + ':key' => { + name => \&phase, + 'map' => { + ':key' => { + name => \&relation, + %$module_map1, + }, + }, + } + }, + }; + + my %definitions = ( + '2' => { + # REQUIRED + 'abstract' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, lazylist => { value => \&string } }, + 'dynamic_config' => { mandatory => 1, value => \&boolean }, + 'generated_by' => { mandatory => 1, value => \&string }, + 'license' => { mandatory => 1, lazylist => { value => \&license } }, + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { value => \&url }, + ':key' => { name => \&custom_2, value => \&anything }, + } + }, + 'name' => { mandatory => 1, value => \&string }, + 'release_status' => { mandatory => 1, value => \&release_status }, + 'version' => { mandatory => 1, value => \&version }, + + # OPTIONAL + 'description' => { value => \&string }, + 'keywords' => { lazylist => { value => \&string } }, + 'no_index' => $no_index_2, + 'optional_features' => { + 'map' => { + ':key' => { + name => \&string, + 'map' => { + description => { value => \&string }, + prereqs => $prereq_map, + ':key' => { name => \&custom_2, value => \&anything }, + } + } + } + }, + 'prereqs' => $prereq_map, + 'provides' => { + 'map' => { + ':key' => { + name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&custom_2, value => \&anything }, + } + } + } + }, + 'resources' => { + 'map' => { + license => { lazylist => { value => \&url } }, + homepage => { value => \&url }, + bugtracker => { + 'map' => { + web => { value => \&url }, + mailto => { value => \&string}, + ':key' => { name => \&custom_2, value => \&anything }, + } + }, + repository => { + 'map' => { + web => { value => \&url }, + url => { value => \&url }, + type => { value => \&string }, + ':key' => { name => \&custom_2, value => \&anything }, + } + }, + ':key' => { value => \&string, name => \&custom_2 }, + } + }, + + # CUSTOM -- additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&custom_2, value => \&anything }, + }, + + '1.4' => { + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { mandatory => 1, value => \&urlspec }, + ':key' => { name => \&string, value => \&anything }, + }, + }, + + 'name' => { mandatory => 1, value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'abstract' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'license' => { mandatory => 1, value => \&license }, + 'generated_by' => { mandatory => 1, value => \&string }, + + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'configure_requires' => $module_map1, + 'conflicts' => $module_map2, + + 'optional_features' => { + 'map' => { + ':key' => { name => \&string, + 'map' => { description => { value => \&string }, + requires => $module_map1, + recommends => $module_map1, + build_requires => $module_map1, + conflicts => $module_map2, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'provides' => { + 'map' => { + ':key' => { name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'no_index' => $no_index_1_3, + 'private' => $no_index_1_3, + + 'keywords' => { list => { value => \&string } }, + + 'resources' => { + 'map' => { license => { value => \&url }, + homepage => { value => \&url }, + bugtracker => { value => \&url }, + repository => { value => \&url }, + ':key' => { value => \&string, name => \&custom_1 }, + } + }, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, + }, + + '1.3' => { + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { mandatory => 1, value => \&urlspec }, + ':key' => { name => \&string, value => \&anything }, + }, + }, + + 'name' => { mandatory => 1, value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'abstract' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'license' => { mandatory => 1, value => \&license }, + 'generated_by' => { mandatory => 1, value => \&string }, + + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + 'optional_features' => { + 'map' => { + ':key' => { name => \&string, + 'map' => { description => { value => \&string }, + requires => $module_map1, + recommends => $module_map1, + build_requires => $module_map1, + conflicts => $module_map2, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'provides' => { + 'map' => { + ':key' => { name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + + 'no_index' => $no_index_1_3, + 'private' => $no_index_1_3, + + 'keywords' => { list => { value => \&string } }, + + 'resources' => { + 'map' => { license => { value => \&url }, + homepage => { value => \&url }, + bugtracker => { value => \&url }, + repository => { value => \&url }, + ':key' => { value => \&string, name => \&custom_1 }, + } + }, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, + }, + + # v1.2 is misleading, it seems to assume that a number of fields where created + # within v1.1, when they were created within v1.2. This may have been an + # original mistake, and that a v1.1 was retro fitted into the timeline, when + # v1.2 was originally slated as v1.1. But I could be wrong ;) + '1.2' => { + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { mandatory => 1, value => \&urlspec }, + ':key' => { name => \&string, value => \&anything }, + }, + }, + + + 'name' => { mandatory => 1, value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'license' => { mandatory => 1, value => \&license }, + 'generated_by' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'abstract' => { mandatory => 1, value => \&string }, + + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'keywords' => { list => { value => \&string } }, + + 'private' => $no_index_1_2, + '$no_index' => $no_index_1_2, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + 'optional_features' => { + 'map' => { + ':key' => { name => \&string, + 'map' => { description => { value => \&string }, + requires => $module_map1, + recommends => $module_map1, + build_requires => $module_map1, + conflicts => $module_map2, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'provides' => { + 'map' => { + ':key' => { name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'resources' => { + 'map' => { license => { value => \&url }, + homepage => { value => \&url }, + bugtracker => { value => \&url }, + repository => { value => \&url }, + ':key' => { value => \&string, name => \&custom_1 }, + } + }, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, + }, + + # note that the 1.1 spec only specifies 'version' as mandatory + '1.1' => { + 'name' => { value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'license' => { value => \&license }, + 'generated_by' => { value => \&string }, + + 'license_uri' => { value => \&url }, + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'private' => $no_index_1_1, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, + }, + + # note that the 1.0 spec doesn't specify optional or mandatory fields + # but we will treat version as mandatory since otherwise META 1.0 is + # completely arbitrary and pointless + '1.0' => { + 'name' => { value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'license' => { value => \&license }, + 'generated_by' => { value => \&string }, + + 'license_uri' => { value => \&url }, + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, + }, + ); + + #--------------------------------------------------------------------------# + # Code + #--------------------------------------------------------------------------# + + + sub new { + my ($class,$data) = @_; + + # create an attributes hash + my $self = { + 'data' => $data, + 'spec' => $data->{'meta-spec'}{'version'} || "1.0", + 'errors' => undef, + }; + + # create the object + return bless $self, $class; + } + + + sub is_valid { + my $self = shift; + my $data = $self->{data}; + my $spec_version = $self->{spec}; + $self->check_map($definitions{$spec_version},$data); + return ! $self->errors; + } + + + sub errors { + my $self = shift; + return () unless(defined $self->{errors}); + return @{$self->{errors}}; + } + + + my $spec_error = "Missing validation action in specification. " + . "Must be one of 'map', 'list', 'lazylist', or 'value'"; + + sub check_map { + my ($self,$spec,$data) = @_; + + if(ref($spec) ne 'HASH') { + $self->_error( "Unknown META specification, cannot validate." ); + return; + } + + if(ref($data) ne 'HASH') { + $self->_error( "Expected a map structure from string or file." ); + return; + } + + for my $key (keys %$spec) { + next unless($spec->{$key}->{mandatory}); + next if(defined $data->{$key}); + push @{$self->{stack}}, $key; + $self->_error( "Missing mandatory field, '$key'" ); + pop @{$self->{stack}}; + } + + for my $key (keys %$data) { + push @{$self->{stack}}, $key; + if($spec->{$key}) { + if($spec->{$key}{value}) { + $spec->{$key}{value}->($self,$key,$data->{$key}); + } elsif($spec->{$key}{'map'}) { + $self->check_map($spec->{$key}{'map'},$data->{$key}); + } elsif($spec->{$key}{'list'}) { + $self->check_list($spec->{$key}{'list'},$data->{$key}); + } elsif($spec->{$key}{'lazylist'}) { + $self->check_lazylist($spec->{$key}{'lazylist'},$data->{$key}); + } else { + $self->_error( "$spec_error for '$key'" ); + } + + } elsif ($spec->{':key'}) { + $spec->{':key'}{name}->($self,$key,$key); + if($spec->{':key'}{value}) { + $spec->{':key'}{value}->($self,$key,$data->{$key}); + } elsif($spec->{':key'}{'map'}) { + $self->check_map($spec->{':key'}{'map'},$data->{$key}); + } elsif($spec->{':key'}{'list'}) { + $self->check_list($spec->{':key'}{'list'},$data->{$key}); + } elsif($spec->{':key'}{'lazylist'}) { + $self->check_lazylist($spec->{':key'}{'lazylist'},$data->{$key}); + } else { + $self->_error( "$spec_error for ':key'" ); + } + + + } else { + $self->_error( "Unknown key, '$key', found in map structure" ); + } + pop @{$self->{stack}}; + } + } + + # if it's a string, make it into a list and check the list + sub check_lazylist { + my ($self,$spec,$data) = @_; + + if ( defined $data && ! ref($data) ) { + $data = [ $data ]; + } + + $self->check_list($spec,$data); + } + + sub check_list { + my ($self,$spec,$data) = @_; + + if(ref($data) ne 'ARRAY') { + $self->_error( "Expected a list structure" ); + return; + } + + if(defined $spec->{mandatory}) { + if(!defined $data->[0]) { + $self->_error( "Missing entries from mandatory list" ); + } + } + + for my $value (@$data) { + push @{$self->{stack}}, $value || "<undef>"; + if(defined $spec->{value}) { + $spec->{value}->($self,'list',$value); + } elsif(defined $spec->{'map'}) { + $self->check_map($spec->{'map'},$value); + } elsif(defined $spec->{'list'}) { + $self->check_list($spec->{'list'},$value); + } elsif(defined $spec->{'lazylist'}) { + $self->check_lazylist($spec->{'lazylist'},$value); + } elsif ($spec->{':key'}) { + $self->check_map($spec,$value); + } else { + $self->_error( "$spec_error associated with '$self->{stack}[-2]'" ); + } + pop @{$self->{stack}}; + } + } + + + sub header { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value && $value =~ /^--- #YAML:1.0/); + } + $self->_error( "file does not have a valid YAML header." ); + return 0; + } + + sub release_status { + my ($self,$key,$value) = @_; + if(defined $value) { + my $version = $self->{data}{version} || ''; + if ( $version =~ /_/ ) { + return 1 if ( $value =~ /\A(?:testing|unstable)\z/ ); + $self->_error( "'$value' for '$key' is invalid for version '$version'" ); + } + else { + return 1 if ( $value =~ /\A(?:stable|testing|unstable)\z/ ); + $self->_error( "'$value' for '$key' is invalid" ); + } + } + else { + $self->_error( "'$key' is not defined" ); + } + return 0; + } + + # _uri_split taken from URI::Split by Gisle Aas, Copyright 2003 + sub _uri_split { + return $_[0] =~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,; + } + + sub url { + my ($self,$key,$value) = @_; + if(defined $value) { + my ($scheme, $auth, $path, $query, $frag) = _uri_split($value); + unless ( defined $scheme && length $scheme ) { + $self->_error( "'$value' for '$key' does not have a URL scheme" ); + return 0; + } + unless ( defined $auth && length $auth ) { + $self->_error( "'$value' for '$key' does not have a URL authority" ); + return 0; + } + return 1; + } + $value ||= ''; + $self->_error( "'$value' for '$key' is not a valid URL." ); + return 0; + } + + sub urlspec { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value && $known_specs{$self->{spec}} eq $value); + if($value && $known_urls{$value}) { + $self->_error( 'META specification URL does not match version' ); + return 0; + } + } + $self->_error( 'Unknown META specification' ); + return 0; + } + + sub anything { return 1 } + + sub string { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value || $value =~ /^0$/); + } + $self->_error( "value is an undefined string" ); + return 0; + } + + sub string_or_undef { + my ($self,$key,$value) = @_; + return 1 unless(defined $value); + return 1 if($value || $value =~ /^0$/); + $self->_error( "No string defined for '$key'" ); + return 0; + } + + sub file { + my ($self,$key,$value) = @_; + return 1 if(defined $value); + $self->_error( "No file defined for '$key'" ); + return 0; + } + + sub exversion { + my ($self,$key,$value) = @_; + if(defined $value && ($value || $value =~ /0/)) { + my $pass = 1; + for(split(",",$value)) { $self->version($key,$_) or ($pass = 0); } + return $pass; + } + $value = '<undef>' unless(defined $value); + $self->_error( "'$value' for '$key' is not a valid version." ); + return 0; + } + + sub version { + my ($self,$key,$value) = @_; + if(defined $value) { + return 0 unless($value || $value =~ /0/); + return 1 if($value =~ /^\s*((<|<=|>=|>|!=|==)\s*)?v?\d+((\.\d+((_|\.)\d+)?)?)/); + } else { + $value = '<undef>'; + } + $self->_error( "'$value' for '$key' is not a valid version." ); + return 0; + } + + sub boolean { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value =~ /^(0|1|true|false)$/); + } else { + $value = '<undef>'; + } + $self->_error( "'$value' for '$key' is not a boolean value." ); + return 0; + } + + my %v1_licenses = ( + 'perl' => 'http://dev.perl.org/licenses/', + 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php', + 'apache' => 'http://apache.org/licenses/LICENSE-2.0', + 'artistic' => 'http://opensource.org/licenses/artistic-license.php', + 'artistic_2' => 'http://opensource.org/licenses/artistic-license-2.0.php', + 'lgpl' => 'http://www.opensource.org/licenses/lgpl-license.phpt', + 'bsd' => 'http://www.opensource.org/licenses/bsd-license.php', + 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php', + 'mit' => 'http://opensource.org/licenses/mit-license.php', + 'mozilla' => 'http://opensource.org/licenses/mozilla1.1.php', + 'open_source' => undef, + 'unrestricted' => undef, + 'restrictive' => undef, + 'unknown' => undef, + ); + + my %v2_licenses = map { $_ => 1 } qw( + agpl_3 + apache_1_1 + apache_2_0 + artistic_1 + artistic_2 + bsd + freebsd + gfdl_1_2 + gfdl_1_3 + gpl_1 + gpl_2 + gpl_3 + lgpl_2_1 + lgpl_3_0 + mit + mozilla_1_0 + mozilla_1_1 + openssl + perl_5 + qpl_1_0 + ssleay + sun + zlib + open_source + restricted + unrestricted + unknown + ); + + sub license { + my ($self,$key,$value) = @_; + my $licenses = $self->{spec} < 2 ? \%v1_licenses : \%v2_licenses; + if(defined $value) { + return 1 if($value && exists $licenses->{$value}); + } else { + $value = '<undef>'; + } + $self->_error( "License '$value' is invalid" ); + return 0; + } + + sub custom_1 { + my ($self,$key) = @_; + if(defined $key) { + # a valid user defined key should be alphabetic + # and contain at least one capital case letter. + return 1 if($key && $key =~ /^[_a-z]+$/i && $key =~ /[A-Z]/); + } else { + $key = '<undef>'; + } + $self->_error( "Custom resource '$key' must be in CamelCase." ); + return 0; + } + + sub custom_2 { + my ($self,$key) = @_; + if(defined $key) { + return 1 if($key && $key =~ /^x_/i); # user defined + } else { + $key = '<undef>'; + } + $self->_error( "Custom key '$key' must begin with 'x_' or 'X_'." ); + return 0; + } + + sub identifier { + my ($self,$key) = @_; + if(defined $key) { + return 1 if($key && $key =~ /^([a-z][_a-z]+)$/i); # spec 2.0 defined + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal identifier." ); + return 0; + } + + sub module { + my ($self,$key) = @_; + if(defined $key) { + return 1 if($key && $key =~ /^[A-Za-z0-9_]+(::[A-Za-z0-9_]+)*$/); + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal module name." ); + return 0; + } + + my @valid_phases = qw/ configure build test runtime develop /; + sub phase { + my ($self,$key) = @_; + if(defined $key) { + return 1 if( length $key && grep { $key eq $_ } @valid_phases ); + return 1 if $key =~ /x_/i; + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal phase." ); + return 0; + } + + my @valid_relations = qw/ requires recommends suggests conflicts /; + sub relation { + my ($self,$key) = @_; + if(defined $key) { + return 1 if( length $key && grep { $key eq $_ } @valid_relations ); + return 1 if $key =~ /x_/i; + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal prereq relationship." ); + return 0; + } + + sub _error { + my $self = shift; + my $mess = shift; + + $mess .= ' ('.join(' -> ',@{$self->{stack}}).')' if($self->{stack}); + $mess .= " [Validation: $self->{spec}]"; + + push @{$self->{errors}}, $mess; + } + + 1; + + + + + __END__ + + + +CPAN_META_VALIDATOR + +$fatpacked{"CPAN/Meta/YAML.pm"} = <<'CPAN_META_YAML'; + package CPAN::Meta::YAML; + BEGIN { + $CPAN::Meta::YAML::VERSION = '0.003'; + } + + use strict; + + # UTF Support? + sub HAVE_UTF8 () { $] >= 5.007003 } + BEGIN { + if ( HAVE_UTF8 ) { + # The string eval helps hide this from Test::MinimumVersion + eval "require utf8;"; + die "Failed to load UTF-8 support" if $@; + } + + # Class structure + require 5.004; + require Exporter; + require Carp; + @CPAN::Meta::YAML::ISA = qw{ Exporter }; + @CPAN::Meta::YAML::EXPORT = qw{ Load Dump }; + @CPAN::Meta::YAML::EXPORT_OK = qw{ LoadFile DumpFile freeze thaw }; + + # Error storage + $CPAN::Meta::YAML::errstr = ''; + } + + # The character class of all characters we need to escape + # NOTE: Inlined, since it's only used once + # my $RE_ESCAPE = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f\"\n]'; + + # Printed form of the unprintable characters in the lowest range + # of ASCII characters, listed by ASCII ordinal position. + my @UNPRINTABLE = qw( + z x01 x02 x03 x04 x05 x06 a + x08 t n v f r x0e x0f + x10 x11 x12 x13 x14 x15 x16 x17 + x18 x19 x1a e x1c x1d x1e x1f + ); + + # Printable characters for escapes + my %UNESCAPES = ( + z => "\x00", a => "\x07", t => "\x09", + n => "\x0a", v => "\x0b", f => "\x0c", + r => "\x0d", e => "\x1b", '\\' => '\\', + ); + + # Special magic boolean words + my %QUOTE = map { $_ => 1 } qw{ + null Null NULL + y Y yes Yes YES n N no No NO + true True TRUE false False FALSE + on On ON off Off OFF + }; + + + + + + ##################################################################### + # Implementation + + # Create an empty CPAN::Meta::YAML object + sub new { + my $class = shift; + bless [ @_ ], $class; + } + + # Create an object from a file + sub read { + my $class = ref $_[0] ? ref shift : shift; + + # Check the file + my $file = shift or return $class->_error( 'You did not specify a file name' ); + return $class->_error( "File '$file' does not exist" ) unless -e $file; + return $class->_error( "'$file' is a directory, not a file" ) unless -f _; + return $class->_error( "Insufficient permissions to read '$file'" ) unless -r _; + + # Slurp in the file + local $/ = undef; + local *CFG; + unless ( open(CFG, $file) ) { + return $class->_error("Failed to open file '$file': $!"); + } + my $contents = <CFG>; + unless ( close(CFG) ) { + return $class->_error("Failed to close file '$file': $!"); + } + + $class->read_string( $contents ); + } + + # Create an object from a string + sub read_string { + my $class = ref $_[0] ? ref shift : shift; + my $self = bless [], $class; + my $string = $_[0]; + eval { + unless ( defined $string ) { + die \"Did not provide a string to load"; + } + + # Byte order marks + # NOTE: Keeping this here to educate maintainers + # my %BOM = ( + # "\357\273\277" => 'UTF-8', + # "\376\377" => 'UTF-16BE', + # "\377\376" => 'UTF-16LE', + # "\377\376\0\0" => 'UTF-32LE' + # "\0\0\376\377" => 'UTF-32BE', + # ); + if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) { + die \"Stream has a non UTF-8 BOM"; + } else { + # Strip UTF-8 bom if found, we'll just ignore it + $string =~ s/^\357\273\277//; + } + + # Try to decode as utf8 + utf8::decode($string) if HAVE_UTF8; + + # Check for some special cases + return $self unless length $string; + unless ( $string =~ /[\012\015]+\z/ ) { + die \"Stream does not end with newline character"; + } + + # Split the file into lines + my @lines = grep { ! /^\s*(?:\#.*)?\z/ } + split /(?:\015{1,2}\012|\015|\012)/, $string; + + # Strip the initial YAML header + @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines; + + # A nibbling parser + while ( @lines ) { + # Do we have a document header? + if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) { + # Handle scalar documents + shift @lines; + if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) { + push @$self, $self->_read_scalar( "$1", [ undef ], \@lines ); + next; + } + } + + if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) { + # A naked document + push @$self, undef; + while ( @lines and $lines[0] !~ /^---/ ) { + shift @lines; + } + + } elsif ( $lines[0] =~ /^\s*\-/ ) { + # An array at the root + my $document = [ ]; + push @$self, $document; + $self->_read_array( $document, [ 0 ], \@lines ); + + } elsif ( $lines[0] =~ /^(\s*)\S/ ) { + # A hash at the root + my $document = { }; + push @$self, $document; + $self->_read_hash( $document, [ length($1) ], \@lines ); + + } else { + die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; + } + } + }; + if ( ref $@ eq 'SCALAR' ) { + return $self->_error(${$@}); + } elsif ( $@ ) { + require Carp; + Carp::croak($@); + } + + return $self; + } + + # Deparse a scalar string to the actual scalar + sub _read_scalar { + my ($self, $string, $indent, $lines) = @_; + + # Trim trailing whitespace + $string =~ s/\s*\z//; + + # Explitic null/undef + return undef if $string eq '~'; + + # Single quote + if ( $string =~ /^\'(.*?)\'(?:\s+\#.*)?\z/ ) { + return '' unless defined $1; + $string = $1; + $string =~ s/\'\'/\'/g; + return $string; + } + + # Double quote. + # The commented out form is simpler, but overloaded the Perl regex + # engine due to recursion and backtracking problems on strings + # larger than 32,000ish characters. Keep it for reference purposes. + # if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) { + if ( $string =~ /^\"([^\\"]*(?:\\.[^\\"]*)*)\"(?:\s+\#.*)?\z/ ) { + # Reusing the variable is a little ugly, + # but avoids a new variable and a string copy. + $string = $1; + $string =~ s/\\"/"/g; + $string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex; + return $string; + } + + # Special cases + if ( $string =~ /^[\'\"!&]/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$string'"; + } + return {} if $string =~ /^{}(?:\s+\#.*)?\z/; + return [] if $string =~ /^\[\](?:\s+\#.*)?\z/; + + # Regular unquoted string + if ( $string !~ /^[>|]/ ) { + if ( + $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ + or + $string =~ /:(?:\s|$)/ + ) { + die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'"; + } + $string =~ s/\s+#.*\z//; + return $string; + } + + # Error + die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines; + + # Check the indent depth + $lines->[0] =~ /^(\s*)/; + $indent->[-1] = length("$1"); + if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + # Pull the lines + my @multiline = (); + while ( @$lines ) { + $lines->[0] =~ /^(\s*)/; + last unless length($1) >= $indent->[-1]; + push @multiline, substr(shift(@$lines), length($1)); + } + + my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n"; + my $t = (substr($string, 1, 1) eq '-') ? '' : "\n"; + return join( $j, @multiline ) . $t; + } + + # Parse an array + sub _read_array { + my ($self, $array, $indent, $lines) = @_; + + while ( @$lines ) { + # Check for a new document + if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { + while ( @$lines and $lines->[0] !~ /^---/ ) { + shift @$lines; + } + return 1; + } + + # Check the indent level + $lines->[0] =~ /^(\s*)/; + if ( length($1) < $indent->[-1] ) { + return 1; + } elsif ( length($1) > $indent->[-1] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) { + # Inline nested hash + my $indent2 = length("$1"); + $lines->[0] =~ s/-/ /; + push @$array, { }; + $self->_read_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); + + } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { + # Array entry with a value + shift @$lines; + push @$array, $self->_read_scalar( "$2", [ @$indent, undef ], $lines ); + + } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) { + shift @$lines; + unless ( @$lines ) { + push @$array, undef; + return 1; + } + if ( $lines->[0] =~ /^(\s*)\-/ ) { + my $indent2 = length("$1"); + if ( $indent->[-1] == $indent2 ) { + # Null array entry + push @$array, undef; + } else { + # Naked indenter + push @$array, [ ]; + $self->_read_array( $array->[-1], [ @$indent, $indent2 ], $lines ); + } + + } elsif ( $lines->[0] =~ /^(\s*)\S/ ) { + push @$array, { }; + $self->_read_hash( $array->[-1], [ @$indent, length("$1") ], $lines ); + + } else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + + } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) { + # This is probably a structure like the following... + # --- + # foo: + # - list + # bar: value + # + # ... so lets return and let the hash parser handle it + return 1; + + } else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + } + + return 1; + } + + # Parse an array + sub _read_hash { + my ($self, $hash, $indent, $lines) = @_; + + while ( @$lines ) { + # Check for a new document + if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { + while ( @$lines and $lines->[0] !~ /^---/ ) { + shift @$lines; + } + return 1; + } + + # Check the indent level + $lines->[0] =~ /^(\s*)/; + if ( length($1) < $indent->[-1] ) { + return 1; + } elsif ( length($1) > $indent->[-1] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + # Get the key + unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+(?:\#.*)?|$)// ) { + if ( $lines->[0] =~ /^\s*[?\'\"]/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"; + } + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + my $key = $1; + + # Do we have a value? + if ( length $lines->[0] ) { + # Yes + $hash->{$key} = $self->_read_scalar( shift(@$lines), [ @$indent, undef ], $lines ); + } else { + # An indent + shift @$lines; + unless ( @$lines ) { + $hash->{$key} = undef; + return 1; + } + if ( $lines->[0] =~ /^(\s*)-/ ) { + $hash->{$key} = []; + $self->_read_array( $hash->{$key}, [ @$indent, length($1) ], $lines ); + } elsif ( $lines->[0] =~ /^(\s*)./ ) { + my $indent2 = length("$1"); + if ( $indent->[-1] >= $indent2 ) { + # Null hash entry + $hash->{$key} = undef; + } else { + $hash->{$key} = {}; + $self->_read_hash( $hash->{$key}, [ @$indent, length($1) ], $lines ); + } + } + } + } + + return 1; + } + + # Save an object to a file + sub write { + my $self = shift; + my $file = shift or return $self->_error('No file name provided'); + + # Write it to the file + open( CFG, '>' . $file ) or return $self->_error( + "Failed to open file '$file' for writing: $!" + ); + print CFG $self->write_string; + close CFG; + + return 1; + } + + # Save an object to a string + sub write_string { + my $self = shift; + return '' unless @$self; + + # Iterate over the documents + my $indent = 0; + my @lines = (); + foreach my $cursor ( @$self ) { + push @lines, '---'; + + # An empty document + if ( ! defined $cursor ) { + # Do nothing + + # A scalar document + } elsif ( ! ref $cursor ) { + $lines[-1] .= ' ' . $self->_write_scalar( $cursor, $indent ); + + # A list at the root + } elsif ( ref $cursor eq 'ARRAY' ) { + unless ( @$cursor ) { + $lines[-1] .= ' []'; + next; + } + push @lines, $self->_write_array( $cursor, $indent, {} ); + + # A hash at the root + } elsif ( ref $cursor eq 'HASH' ) { + unless ( %$cursor ) { + $lines[-1] .= ' {}'; + next; + } + push @lines, $self->_write_hash( $cursor, $indent, {} ); + + } else { + Carp::croak("Cannot serialize " . ref($cursor)); + } + } + + join '', map { "$_\n" } @lines; + } + + sub _write_scalar { + my $string = $_[1]; + return '~' unless defined $string; + return "''" unless length $string; + if ( $string =~ /[\x00-\x08\x0b-\x0d\x0e-\x1f\"\'\n]/ ) { + $string =~ s/\\/\\\\/g; + $string =~ s/"/\\"/g; + $string =~ s/\n/\\n/g; + $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g; + return qq|"$string"|; + } + if ( $string =~ /(?:^\W|\s)/ or $QUOTE{$string} ) { + return "'$string'"; + } + return $string; + } + + sub _write_array { + my ($self, $array, $indent, $seen) = @_; + if ( $seen->{refaddr($array)}++ ) { + die "CPAN::Meta::YAML does not support circular references"; + } + my @lines = (); + foreach my $el ( @$array ) { + my $line = (' ' x $indent) . '-'; + my $type = ref $el; + if ( ! $type ) { + $line .= ' ' . $self->_write_scalar( $el, $indent + 1 ); + push @lines, $line; + + } elsif ( $type eq 'ARRAY' ) { + if ( @$el ) { + push @lines, $line; + push @lines, $self->_write_array( $el, $indent + 1, $seen ); + } else { + $line .= ' []'; + push @lines, $line; + } + + } elsif ( $type eq 'HASH' ) { + if ( keys %$el ) { + push @lines, $line; + push @lines, $self->_write_hash( $el, $indent + 1, $seen ); + } else { + $line .= ' {}'; + push @lines, $line; + } + + } else { + die "CPAN::Meta::YAML does not support $type references"; + } + } + + @lines; + } + + sub _write_hash { + my ($self, $hash, $indent, $seen) = @_; + if ( $seen->{refaddr($hash)}++ ) { + die "CPAN::Meta::YAML does not support circular references"; + } + my @lines = (); + foreach my $name ( sort keys %$hash ) { + my $el = $hash->{$name}; + my $line = (' ' x $indent) . "$name:"; + my $type = ref $el; + if ( ! $type ) { + $line .= ' ' . $self->_write_scalar( $el, $indent + 1 ); + push @lines, $line; + + } elsif ( $type eq 'ARRAY' ) { + if ( @$el ) { + push @lines, $line; + push @lines, $self->_write_array( $el, $indent + 1, $seen ); + } else { + $line .= ' []'; + push @lines, $line; + } + + } elsif ( $type eq 'HASH' ) { + if ( keys %$el ) { + push @lines, $line; + push @lines, $self->_write_hash( $el, $indent + 1, $seen ); + } else { + $line .= ' {}'; + push @lines, $line; + } + + } else { + die "CPAN::Meta::YAML does not support $type references"; + } + } + + @lines; + } + + # Set error + sub _error { + $CPAN::Meta::YAML::errstr = $_[1]; + undef; + } + + # Retrieve error + sub errstr { + $CPAN::Meta::YAML::errstr; + } + + + + + + ##################################################################### + # YAML Compatibility + + sub Dump { + CPAN::Meta::YAML->new(@_)->write_string; + } + + sub Load { + my $self = CPAN::Meta::YAML->read_string(@_); + unless ( $self ) { + Carp::croak("Failed to load YAML document from string"); + } + if ( wantarray ) { + return @$self; + } else { + # To match YAML.pm, return the last document + return $self->[-1]; + } + } + + BEGIN { + *freeze = *Dump; + *thaw = *Load; + } + + sub DumpFile { + my $file = shift; + CPAN::Meta::YAML->new(@_)->write($file); + } + + sub LoadFile { + my $self = CPAN::Meta::YAML->read($_[0]); + unless ( $self ) { + Carp::croak("Failed to load YAML document from '" . ($_[0] || '') . "'"); + } + if ( wantarray ) { + return @$self; + } else { + # Return only the last document to match YAML.pm, + return $self->[-1]; + } + } + + + + + + ##################################################################### + # Use Scalar::Util if possible, otherwise emulate it + + BEGIN { + eval { + require Scalar::Util; + *refaddr = *Scalar::Util::refaddr; + }; + eval <<'END_PERL' if $@; + # Failed to load Scalar::Util + sub refaddr { + my $pkg = ref($_[0]) or return undef; + if ( !! UNIVERSAL::can($_[0], 'can') ) { + bless $_[0], 'Scalar::Util::Fake'; + } else { + $pkg = undef; + } + "$_[0]" =~ /0x(\w+)/; + my $i = do { local $^W; hex $1 }; + bless $_[0], $pkg if defined $pkg; + $i; + } + END_PERL + + } + + 1; + + + + + __END__ + + + # ABSTRACT: Read and write a subset of YAML for CPAN Meta files + + +CPAN_META_YAML + +$fatpacked{"HTTP/Tiny.pm"} = <<'HTTP_TINY'; + # vim: ts=4 sts=4 sw=4 et: + # + # This file is part of HTTP-Tiny + # + # This software is copyright (c) 2011 by Christian Hansen. + # + # This is free software; you can redistribute it and/or modify it under + # the same terms as the Perl 5 programming language system itself. + # + package HTTP::Tiny; + BEGIN { + $HTTP::Tiny::VERSION = '0.009'; + } + use strict; + use warnings; + # ABSTRACT: A small, simple, correct HTTP/1.1 client + + use Carp (); + + + my @attributes; + BEGIN { + @attributes = qw(agent default_headers max_redirect max_size proxy timeout); + no strict 'refs'; + for my $accessor ( @attributes ) { + *{$accessor} = sub { + @_ > 1 ? $_[0]->{$accessor} = $_[1] : $_[0]->{$accessor}; + }; + } + } + + sub new { + my($class, %args) = @_; + (my $agent = $class) =~ s{::}{-}g; + my $self = { + agent => $agent . "/" . ($class->VERSION || 0), + max_redirect => 5, + timeout => 60, + }; + for my $key ( @attributes ) { + $self->{$key} = $args{$key} if exists $args{$key} + } + return bless $self, $class; + } + + + sub get { + my ($self, $url, $args) = @_; + @_ == 2 || (@_ == 3 && ref $args eq 'HASH') + or Carp::croak(q/Usage: $http->get(URL, [HASHREF])/); + return $self->request('GET', $url, $args || {}); + } + + + sub mirror { + my ($self, $url, $file, $args) = @_; + @_ == 3 || (@_ == 4 && ref $args eq 'HASH') + or Carp::croak(q/Usage: $http->mirror(URL, FILE, [HASHREF])/); + if ( -e $file and my $mtime = (stat($file))[9] ) { + $args->{headers}{'if-modified-since'} ||= $self->_http_date($mtime); + } + my $tempfile = $file . int(rand(2**31)); + open my $fh, ">", $tempfile + or Carp::croak(qq/Error: Could not open temporary file $tempfile for downloading: $!/); + $args->{data_callback} = sub { print {$fh} $_[0] }; + my $response = $self->request('GET', $url, $args); + close $fh + or Carp::croak(qq/Error: Could not close temporary file $tempfile: $!/); + if ( $response->{success} ) { + rename $tempfile, $file + or Carp::croak "Error replacing $file with $tempfile: $!\n"; + my $lm = $response->{headers}{'last-modified'}; + if ( $lm and my $mtime = $self->_parse_http_date($lm) ) { + utime $mtime, $mtime, $file; + } + } + $response->{success} ||= $response->{status} eq '304'; + unlink $tempfile; + return $response; + } + + + my %idempotent = map { $_ => 1 } qw/GET HEAD PUT DELETE OPTIONS TRACE/; + + sub request { + my ($self, $method, $url, $args) = @_; + @_ == 3 || (@_ == 4 && ref $args eq 'HASH') + or Carp::croak(q/Usage: $http->request(METHOD, URL, [HASHREF])/); + $args ||= {}; # we keep some state in this during _request + + # RFC 2616 Section 8.1.4 mandates a single retry on broken socket + my $response; + for ( 0 .. 1 ) { + $response = eval { $self->_request($method, $url, $args) }; + last unless $@ && $idempotent{$method} + && $@ =~ m{^(?:Socket closed|Unexpected end)}; + } + + if (my $e = "$@") { + $response = { + success => q{}, + status => 599, + reason => 'Internal Exception', + content => $e, + headers => { + 'content-type' => 'text/plain', + 'content-length' => length $e, + } + }; + } + return $response; + } + + my %DefaultPort = ( + http => 80, + https => 443, + ); + + sub _request { + my ($self, $method, $url, $args) = @_; + + my ($scheme, $host, $port, $path_query) = $self->_split_url($url); + + my $request = { + method => $method, + scheme => $scheme, + host_port => ($port == $DefaultPort{$scheme} ? $host : "$host:$port"), + uri => $path_query, + headers => {}, + }; + + my $handle = HTTP::Tiny::Handle->new(timeout => $self->{timeout}); + + if ($self->{proxy}) { + $request->{uri} = "$scheme://$request->{host_port}$path_query"; + croak(qq/HTTPS via proxy is not supported/) + if $request->{scheme} eq 'https'; + $handle->connect(($self->_split_url($self->{proxy}))[0..2]); + } + else { + $handle->connect($scheme, $host, $port); + } + + $self->_prepare_headers_and_cb($request, $args); + $handle->write_request($request); + + my $response; + do { $response = $handle->read_response_header } + until (substr($response->{status},0,1) ne '1'); + + if ( my @redir_args = $self->_maybe_redirect($request, $response, $args) ) { + $handle->close; + return $self->_request(@redir_args, $args); + } + + if ($method eq 'HEAD' || $response->{status} =~ /^[23]04/) { + # response has no message body + } + else { + my $data_cb = $self->_prepare_data_cb($response, $args); + $handle->read_body($data_cb, $response); + } + + $handle->close; + $response->{success} = substr($response->{status},0,1) eq '2'; + return $response; + } + + sub _prepare_headers_and_cb { + my ($self, $request, $args) = @_; + + for ($self->{default_headers}, $args->{headers}) { + next unless defined; + while (my ($k, $v) = each %$_) { + $request->{headers}{lc $k} = $v; + } + } + $request->{headers}{'host'} = $request->{host_port}; + $request->{headers}{'connection'} = "close"; + $request->{headers}{'user-agent'} ||= $self->{agent}; + + if (defined $args->{content}) { + $request->{headers}{'content-type'} ||= "application/octet-stream"; + if (ref $args->{content} eq 'CODE') { + $request->{headers}{'transfer-encoding'} = 'chunked' + unless $request->{headers}{'content-length'} + || $request->{headers}{'transfer-encoding'}; + $request->{cb} = $args->{content}; + } + else { + my $content = $args->{content}; + if ( $] ge '5.008' ) { + utf8::downgrade($content, 1) + or Carp::croak(q/Wide character in request message body/); + } + $request->{headers}{'content-length'} = length $content + unless $request->{headers}{'content-length'} + || $request->{headers}{'transfer-encoding'}; + $request->{cb} = sub { substr $content, 0, length $content, '' }; + } + $request->{trailer_cb} = $args->{trailer_callback} + if ref $args->{trailer_callback} eq 'CODE'; + } + return; + } + + sub _prepare_data_cb { + my ($self, $response, $args) = @_; + my $data_cb = $args->{data_callback}; + $response->{content} = ''; + + if (!$data_cb || $response->{status} !~ /^2/) { + if (defined $self->{max_size}) { + $data_cb = sub { + $_[1]->{content} .= $_[0]; + die(qq/Size of response body exceeds the maximum allowed of $self->{max_size}\n/) + if length $_[1]->{content} > $self->{max_size}; + }; + } + else { + $data_cb = sub { $_[1]->{content} .= $_[0] }; + } + } + return $data_cb; + } + + sub _maybe_redirect { + my ($self, $request, $response, $args) = @_; + my $headers = $response->{headers}; + my ($status, $method) = ($response->{status}, $request->{method}); + if (($status eq '303' or ($status =~ /^30[127]/ && $method =~ /^GET|HEAD$/)) + and $headers->{location} + and ++$args->{redirects} <= $self->{max_redirect} + ) { + my $location = ($headers->{location} =~ /^\//) + ? "$request->{scheme}://$request->{host_port}$headers->{location}" + : $headers->{location} ; + return (($status eq '303' ? 'GET' : $method), $location); + } + return; + } + + sub _split_url { + my $url = pop; + + # URI regex adapted from the URI module + my ($scheme, $authority, $path_query) = $url =~ m<\A([^:/?#]+)://([^/?#]*)([^#]*)> + or Carp::croak(qq/Cannot parse URL: '$url'/); + + $scheme = lc $scheme; + $path_query = "/$path_query" unless $path_query =~ m<\A/>; + + my $host = (length($authority)) ? lc $authority : 'localhost'; + $host =~ s/\A[^@]*@//; # userinfo + my $port = do { + $host =~ s/:([0-9]*)\z// && length $1 + ? $1 + : ($scheme eq 'http' ? 80 : $scheme eq 'https' ? 443 : undef); + }; + + return ($scheme, $host, $port, $path_query); + } + + # Date conversions adapted from HTTP::Date + my $DoW = "Sun|Mon|Tue|Wed|Thu|Fri|Sat"; + my $MoY = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec"; + sub _http_date { + my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($_[1]); + return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", + substr($DoW,$wday*4,3), + $mday, substr($MoY,$mon*4,3), $year+1900, + $hour, $min, $sec + ); + } + + sub _parse_http_date { + my ($self, $str) = @_; + require Time::Local; + my @tl_parts; + if ($str =~ /^[SMTWF][a-z]+, +(\d{1,2}) ($MoY) +(\d\d\d\d) +(\d\d):(\d\d):(\d\d) +GMT$/) { + @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3); + } + elsif ($str =~ /^[SMTWF][a-z]+, +(\d\d)-($MoY)-(\d{2,4}) +(\d\d):(\d\d):(\d\d) +GMT$/ ) { + @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3); + } + elsif ($str =~ /^[SMTWF][a-z]+ +($MoY) +(\d{1,2}) +(\d\d):(\d\d):(\d\d) +(?:[^0-9]+ +)?(\d\d\d\d)$/ ) { + @tl_parts = ($5, $4, $3, $2, (index($MoY,$1)/4), $6); + } + return eval { + my $t = @tl_parts ? Time::Local::timegm(@tl_parts) : -1; + $t < 0 ? undef : $t; + }; + } + + package + HTTP::Tiny::Handle; # hide from PAUSE/indexers + use strict; + use warnings; + + use Carp qw[croak]; + use Errno qw[EINTR EPIPE]; + use IO::Socket qw[SOCK_STREAM]; + + sub BUFSIZE () { 32768 } + + my $Printable = sub { + local $_ = shift; + s/\r/\\r/g; + s/\n/\\n/g; + s/\t/\\t/g; + s/([^\x20-\x7E])/sprintf('\\x%.2X', ord($1))/ge; + $_; + }; + + my $Token = qr/[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/; + + sub new { + my ($class, %args) = @_; + return bless { + rbuf => '', + timeout => 60, + max_line_size => 16384, + max_header_lines => 64, + %args + }, $class; + } + + my $ssl_verify_args = { + check_cn => "when_only", + wildcards_in_alt => "anywhere", + wildcards_in_cn => "anywhere" + }; + + sub connect { + @_ == 4 || croak(q/Usage: $handle->connect(scheme, host, port)/); + my ($self, $scheme, $host, $port) = @_; + + if ( $scheme eq 'https' ) { + eval "require IO::Socket::SSL" + unless exists $INC{'IO/Socket/SSL.pm'}; + croak(qq/IO::Socket::SSL must be installed for https support\n/) + unless $INC{'IO/Socket/SSL.pm'}; + } + elsif ( $scheme ne 'http' ) { + croak(qq/Unsupported URL scheme '$scheme'/); + } + + $self->{fh} = 'IO::Socket::INET'->new( + PeerHost => $host, + PeerPort => $port, + Proto => 'tcp', + Type => SOCK_STREAM, + Timeout => $self->{timeout} + ) or croak(qq/Could not connect to '$host:$port': $@/); + + binmode($self->{fh}) + or croak(qq/Could not binmode() socket: '$!'/); + + if ( $scheme eq 'https') { + IO::Socket::SSL->start_SSL($self->{fh}); + ref($self->{fh}) eq 'IO::Socket::SSL' + or die(qq/SSL connection failed for $host\n/); + $self->{fh}->verify_hostname( $host, $ssl_verify_args ) + or die(qq/SSL certificate not valid for $host\n/); + } + + $self->{host} = $host; + $self->{port} = $port; + + return $self; + } + + sub close { + @_ == 1 || croak(q/Usage: $handle->close()/); + my ($self) = @_; + CORE::close($self->{fh}) + or croak(qq/Could not close socket: '$!'/); + } + + sub write { + @_ == 2 || croak(q/Usage: $handle->write(buf)/); + my ($self, $buf) = @_; + + if ( $] ge '5.008' ) { + utf8::downgrade($buf, 1) + or croak(q/Wide character in write()/); + } + + my $len = length $buf; + my $off = 0; + + local $SIG{PIPE} = 'IGNORE'; + + while () { + $self->can_write + or croak(q/Timed out while waiting for socket to become ready for writing/); + my $r = syswrite($self->{fh}, $buf, $len, $off); + if (defined $r) { + $len -= $r; + $off += $r; + last unless $len > 0; + } + elsif ($! == EPIPE) { + croak(qq/Socket closed by remote server: $!/); + } + elsif ($! != EINTR) { + croak(qq/Could not write to socket: '$!'/); + } + } + return $off; + } + + sub read { + @_ == 2 || @_ == 3 || croak(q/Usage: $handle->read(len [, allow_partial])/); + my ($self, $len, $allow_partial) = @_; + + my $buf = ''; + my $got = length $self->{rbuf}; + + if ($got) { + my $take = ($got < $len) ? $got : $len; + $buf = substr($self->{rbuf}, 0, $take, ''); + $len -= $take; + } + + while ($len > 0) { + $self->can_read + or croak(q/Timed out while waiting for socket to become ready for reading/); + my $r = sysread($self->{fh}, $buf, $len, length $buf); + if (defined $r) { + last unless $r; + $len -= $r; + } + elsif ($! != EINTR) { + croak(qq/Could not read from socket: '$!'/); + } + } + if ($len && !$allow_partial) { + croak(q/Unexpected end of stream/); + } + return $buf; + } + + sub readline { + @_ == 1 || croak(q/Usage: $handle->readline()/); + my ($self) = @_; + + while () { + if ($self->{rbuf} =~ s/\A ([^\x0D\x0A]* \x0D?\x0A)//x) { + return $1; + } + if (length $self->{rbuf} >= $self->{max_line_size}) { + croak(qq/Line size exceeds the maximum allowed size of $self->{max_line_size}/); + } + $self->can_read + or croak(q/Timed out while waiting for socket to become ready for reading/); + my $r = sysread($self->{fh}, $self->{rbuf}, BUFSIZE, length $self->{rbuf}); + if (defined $r) { + last unless $r; + } + elsif ($! != EINTR) { + croak(qq/Could not read from socket: '$!'/); + } + } + croak(q/Unexpected end of stream while looking for line/); + } + + sub read_header_lines { + @_ == 1 || @_ == 2 || croak(q/Usage: $handle->read_header_lines([headers])/); + my ($self, $headers) = @_; + $headers ||= {}; + my $lines = 0; + my $val; + + while () { + my $line = $self->readline; + + if (++$lines >= $self->{max_header_lines}) { + croak(qq/Header lines exceeds maximum number allowed of $self->{max_header_lines}/); + } + elsif ($line =~ /\A ([^\x00-\x1F\x7F:]+) : [\x09\x20]* ([^\x0D\x0A]*)/x) { + my ($field_name) = lc $1; + if (exists $headers->{$field_name}) { + for ($headers->{$field_name}) { + $_ = [$_] unless ref $_ eq "ARRAY"; + push @$_, $2; + $val = \$_->[-1]; + } + } + else { + $val = \($headers->{$field_name} = $2); + } + } + elsif ($line =~ /\A [\x09\x20]+ ([^\x0D\x0A]*)/x) { + $val + or croak(q/Unexpected header continuation line/); + next unless length $1; + $$val .= ' ' if length $$val; + $$val .= $1; + } + elsif ($line =~ /\A \x0D?\x0A \z/x) { + last; + } + else { + croak(q/Malformed header line: / . $Printable->($line)); + } + } + return $headers; + } + + sub write_request { + @_ == 2 || croak(q/Usage: $handle->write_request(request)/); + my($self, $request) = @_; + $self->write_request_header(@{$request}{qw/method uri headers/}); + $self->write_body($request) if $request->{cb}; + return; + } + + my %HeaderCase = ( + 'content-md5' => 'Content-MD5', + 'etag' => 'ETag', + 'te' => 'TE', + 'www-authenticate' => 'WWW-Authenticate', + 'x-xss-protection' => 'X-XSS-Protection', + ); + + sub write_header_lines { + (@_ == 2 && ref $_[1] eq 'HASH') || croak(q/Usage: $handle->write_header_lines(headers)/); + my($self, $headers) = @_; + + my $buf = ''; + while (my ($k, $v) = each %$headers) { + my $field_name = lc $k; + if (exists $HeaderCase{$field_name}) { + $field_name = $HeaderCase{$field_name}; + } + else { + $field_name =~ /\A $Token+ \z/xo + or croak(q/Invalid HTTP header field name: / . $Printable->($field_name)); + $field_name =~ s/\b(\w)/\u$1/g; + $HeaderCase{lc $field_name} = $field_name; + } + for (ref $v eq 'ARRAY' ? @$v : $v) { + /[^\x0D\x0A]/ + or croak(qq/Invalid HTTP header field value ($field_name): / . $Printable->($_)); + $buf .= "$field_name: $_\x0D\x0A"; + } + } + $buf .= "\x0D\x0A"; + return $self->write($buf); + } + + sub read_body { + @_ == 3 || croak(q/Usage: $handle->read_body(callback, response)/); + my ($self, $cb, $response) = @_; + my $te = $response->{headers}{'transfer-encoding'} || ''; + if ( grep { /chunked/i } ( ref $te eq 'ARRAY' ? @$te : $te ) ) { + $self->read_chunked_body($cb, $response); + } + else { + $self->read_content_body($cb, $response); + } + return; + } + + sub write_body { + @_ == 2 || croak(q/Usage: $handle->write_body(request)/); + my ($self, $request) = @_; + if ($request->{headers}{'content-length'}) { + return $self->write_content_body($request); + } + else { + return $self->write_chunked_body($request); + } + } + + sub read_content_body { + @_ == 3 || @_ == 4 || croak(q/Usage: $handle->read_content_body(callback, response, [read_length])/); + my ($self, $cb, $response, $content_length) = @_; + $content_length ||= $response->{headers}{'content-length'}; + + if ( $content_length ) { + my $len = $content_length; + while ($len > 0) { + my $read = ($len > BUFSIZE) ? BUFSIZE : $len; + $cb->($self->read($read, 0), $response); + $len -= $read; + } + } + else { + my $chunk; + $cb->($chunk, $response) while length( $chunk = $self->read(BUFSIZE, 1) ); + } + + return; + } + + sub write_content_body { + @_ == 2 || croak(q/Usage: $handle->write_content_body(request)/); + my ($self, $request) = @_; + + my ($len, $content_length) = (0, $request->{headers}{'content-length'}); + while () { + my $data = $request->{cb}->(); + + defined $data && length $data + or last; + + if ( $] ge '5.008' ) { + utf8::downgrade($data, 1) + or croak(q/Wide character in write_content()/); + } + + $len += $self->write($data); + } + + $len == $content_length + or croak(qq/Content-Length missmatch (got: $len expected: $content_length)/); + + return $len; + } + + sub read_chunked_body { + @_ == 3 || croak(q/Usage: $handle->read_chunked_body(callback, $response)/); + my ($self, $cb, $response) = @_; + + while () { + my $head = $self->readline; + + $head =~ /\A ([A-Fa-f0-9]+)/x + or croak(q/Malformed chunk head: / . $Printable->($head)); + + my $len = hex($1) + or last; + + $self->read_content_body($cb, $response, $len); + + $self->read(2) eq "\x0D\x0A" + or croak(q/Malformed chunk: missing CRLF after chunk data/); + } + $self->read_header_lines($response->{headers}); + return; + } + + sub write_chunked_body { + @_ == 2 || croak(q/Usage: $handle->write_chunked_body(request)/); + my ($self, $request) = @_; + + my $len = 0; + while () { + my $data = $request->{cb}->(); + + defined $data && length $data + or last; + + if ( $] ge '5.008' ) { + utf8::downgrade($data, 1) + or croak(q/Wide character in write_chunked_body()/); + } + + $len += length $data; + + my $chunk = sprintf '%X', length $data; + $chunk .= "\x0D\x0A"; + $chunk .= $data; + $chunk .= "\x0D\x0A"; + + $self->write($chunk); + } + $self->write("0\x0D\x0A"); + $self->write_header_lines($request->{trailer_cb}->()) + if ref $request->{trailer_cb} eq 'CODE'; + return $len; + } + + sub read_response_header { + @_ == 1 || croak(q/Usage: $handle->read_response_header()/); + my ($self) = @_; + + my $line = $self->readline; + + $line =~ /\A (HTTP\/(0*\d+\.0*\d+)) [\x09\x20]+ ([0-9]{3}) [\x09\x20]+ ([^\x0D\x0A]*) \x0D?\x0A/x + or croak(q/Malformed Status-Line: / . $Printable->($line)); + + my ($protocol, $version, $status, $reason) = ($1, $2, $3, $4); + + croak (qq/Unsupported HTTP protocol: $protocol/) + unless $version =~ /0*1\.0*[01]/; + + return { + status => $status, + reason => $reason, + headers => $self->read_header_lines, + protocol => $protocol, + }; + } + + sub write_request_header { + @_ == 4 || croak(q/Usage: $handle->write_request_header(method, request_uri, headers)/); + my ($self, $method, $request_uri, $headers) = @_; + + return $self->write("$method $request_uri HTTP/1.1\x0D\x0A") + + $self->write_header_lines($headers); + } + + sub _do_timeout { + my ($self, $type, $timeout) = @_; + $timeout = $self->{timeout} + unless defined $timeout && $timeout >= 0; + + my $fd = fileno $self->{fh}; + defined $fd && $fd >= 0 + or croak(q/select(2): 'Bad file descriptor'/); + + my $initial = time; + my $pending = $timeout; + my $nfound; + + vec(my $fdset = '', $fd, 1) = 1; + + while () { + $nfound = ($type eq 'read') + ? select($fdset, undef, undef, $pending) + : select(undef, $fdset, undef, $pending) ; + if ($nfound == -1) { + $! == EINTR + or croak(qq/select(2): '$!'/); + redo if !$timeout || ($pending = $timeout - (time - $initial)) > 0; + $nfound = 0; + } + last; + } + $! = 0; + return $nfound; + } + + sub can_read { + @_ == 1 || @_ == 2 || croak(q/Usage: $handle->can_read([timeout])/); + my $self = shift; + return $self->_do_timeout('read', @_) + } + + sub can_write { + @_ == 1 || @_ == 2 || croak(q/Usage: $handle->can_write([timeout])/); + my $self = shift; + return $self->_do_timeout('write', @_) + } + + 1; + + + + __END__ + =pod + +HTTP_TINY + +$fatpacked{"JSON/PP.pm"} = <<'JSON_PP'; + package JSON::PP; + + # JSON-2.0 + + use 5.005; + use strict; + use base qw(Exporter); + use overload (); + + use Carp (); + use B (); + #use Devel::Peek; + + $JSON::PP::VERSION = '2.27200'; + + @JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json); + + # instead of hash-access, i tried index-access for speed. + # but this method is not faster than what i expected. so it will be changed. + + use constant P_ASCII => 0; + use constant P_LATIN1 => 1; + use constant P_UTF8 => 2; + use constant P_INDENT => 3; + use constant P_CANONICAL => 4; + use constant P_SPACE_BEFORE => 5; + use constant P_SPACE_AFTER => 6; + use constant P_ALLOW_NONREF => 7; + use constant P_SHRINK => 8; + use constant P_ALLOW_BLESSED => 9; + use constant P_CONVERT_BLESSED => 10; + use constant P_RELAXED => 11; + + use constant P_LOOSE => 12; + use constant P_ALLOW_BIGNUM => 13; + use constant P_ALLOW_BAREKEY => 14; + use constant P_ALLOW_SINGLEQUOTE => 15; + use constant P_ESCAPE_SLASH => 16; + use constant P_AS_NONBLESSED => 17; + + use constant P_ALLOW_UNKNOWN => 18; + + use constant OLD_PERL => $] < 5.008 ? 1 : 0; + + BEGIN { + my @xs_compati_bit_properties = qw( + latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink + allow_blessed convert_blessed relaxed allow_unknown + ); + my @pp_bit_properties = qw( + allow_singlequote allow_bignum loose + allow_barekey escape_slash as_nonblessed + ); + + # Perl version check, Unicode handling is enable? + # Helper module sets @JSON::PP::_properties. + if ($] < 5.008 ) { + my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005'; + eval qq| require $helper |; + if ($@) { Carp::croak $@; } + } + + for my $name (@xs_compati_bit_properties, @pp_bit_properties) { + my $flag_name = 'P_' . uc($name); + + eval qq/ + sub $name { + my \$enable = defined \$_[1] ? \$_[1] : 1; + + if (\$enable) { + \$_[0]->{PROPS}->[$flag_name] = 1; + } + else { + \$_[0]->{PROPS}->[$flag_name] = 0; + } + + \$_[0]; + } + + sub get_$name { + \$_[0]->{PROPS}->[$flag_name] ? 1 : ''; + } + /; + } + + } + + + + # Functions + + my %encode_allow_method + = map {($_ => 1)} qw/utf8 pretty allow_nonref latin1 self_encode escape_slash + allow_blessed convert_blessed indent indent_length allow_bignum + as_nonblessed + /; + my %decode_allow_method + = map {($_ => 1)} qw/utf8 allow_nonref loose allow_singlequote allow_bignum + allow_barekey max_size relaxed/; + + + my $JSON; # cache + + sub encode_json ($) { # encode + ($JSON ||= __PACKAGE__->new->utf8)->encode(@_); + } + + + sub decode_json { # decode + ($JSON ||= __PACKAGE__->new->utf8)->decode(@_); + } + + # Obsoleted + + sub to_json($) { + Carp::croak ("JSON::PP::to_json has been renamed to encode_json."); + } + + + sub from_json($) { + Carp::croak ("JSON::PP::from_json has been renamed to decode_json."); + } + + + # Methods + + sub new { + my $class = shift; + my $self = { + max_depth => 512, + max_size => 0, + indent => 0, + FLAGS => 0, + fallback => sub { encode_error('Invalid value. JSON can only reference.') }, + indent_length => 3, + }; + + bless $self, $class; + } + + + sub encode { + return $_[0]->PP_encode_json($_[1]); + } + + + sub decode { + return $_[0]->PP_decode_json($_[1], 0x00000000); + } + + + sub decode_prefix { + return $_[0]->PP_decode_json($_[1], 0x00000001); + } + + + # accessor + + + # pretty printing + + sub pretty { + my ($self, $v) = @_; + my $enable = defined $v ? $v : 1; + + if ($enable) { # indent_length(3) for JSON::XS compatibility + $self->indent(1)->indent_length(3)->space_before(1)->space_after(1); + } + else { + $self->indent(0)->space_before(0)->space_after(0); + } + + $self; + } + + # etc + + sub max_depth { + my $max = defined $_[1] ? $_[1] : 0x80000000; + $_[0]->{max_depth} = $max; + $_[0]; + } + + + sub get_max_depth { $_[0]->{max_depth}; } + + + sub max_size { + my $max = defined $_[1] ? $_[1] : 0; + $_[0]->{max_size} = $max; + $_[0]; + } + + + sub get_max_size { $_[0]->{max_size}; } + + + sub filter_json_object { + $_[0]->{cb_object} = defined $_[1] ? $_[1] : 0; + $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0; + $_[0]; + } + + sub filter_json_single_key_object { + if (@_ > 1) { + $_[0]->{cb_sk_object}->{$_[1]} = $_[2]; + } + $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0; + $_[0]; + } + + sub indent_length { + if (!defined $_[1] or $_[1] > 15 or $_[1] < 0) { + Carp::carp "The acceptable range of indent_length() is 0 to 15."; + } + else { + $_[0]->{indent_length} = $_[1]; + } + $_[0]; + } + + sub get_indent_length { + $_[0]->{indent_length}; + } + + sub sort_by { + $_[0]->{sort_by} = defined $_[1] ? $_[1] : 1; + $_[0]; + } + + sub allow_bigint { + Carp::carp("allow_bigint() is obsoleted. use allow_bignum() insted."); + } + + ############################### + + ### + ### Perl => JSON + ### + + + { # Convert + + my $max_depth; + my $indent; + my $ascii; + my $latin1; + my $utf8; + my $space_before; + my $space_after; + my $canonical; + my $allow_blessed; + my $convert_blessed; + + my $indent_length; + my $escape_slash; + my $bignum; + my $as_nonblessed; + + my $depth; + my $indent_count; + my $keysort; + + + sub PP_encode_json { + my $self = shift; + my $obj = shift; + + $indent_count = 0; + $depth = 0; + + my $idx = $self->{PROPS}; + + ($ascii, $latin1, $utf8, $indent, $canonical, $space_before, $space_after, $allow_blessed, + $convert_blessed, $escape_slash, $bignum, $as_nonblessed) + = @{$idx}[P_ASCII .. P_SPACE_AFTER, P_ALLOW_BLESSED, P_CONVERT_BLESSED, + P_ESCAPE_SLASH, P_ALLOW_BIGNUM, P_AS_NONBLESSED]; + + ($max_depth, $indent_length) = @{$self}{qw/max_depth indent_length/}; + + $keysort = $canonical ? sub { $a cmp $b } : undef; + + if ($self->{sort_by}) { + $keysort = ref($self->{sort_by}) eq 'CODE' ? $self->{sort_by} + : $self->{sort_by} =~ /\D+/ ? $self->{sort_by} + : sub { $a cmp $b }; + } + + encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)") + if(!ref $obj and !$idx->[ P_ALLOW_NONREF ]); + + my $str = $self->object_to_json($obj); + + $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible + + unless ($ascii or $latin1 or $utf8) { + utf8::upgrade($str); + } + + if ($idx->[ P_SHRINK ]) { + utf8::downgrade($str, 1); + } + + return $str; + } + + + sub object_to_json { + my ($self, $obj) = @_; + my $type = ref($obj); + + if($type eq 'HASH'){ + return $self->hash_to_json($obj); + } + elsif($type eq 'ARRAY'){ + return $self->array_to_json($obj); + } + elsif ($type) { # blessed object? + if (blessed($obj)) { + + return $self->value_to_json($obj) if ( $obj->isa('JSON::PP::Boolean') ); + + if ( $convert_blessed and $obj->can('TO_JSON') ) { + my $result = $obj->TO_JSON(); + if ( defined $result and ref( $result ) ) { + if ( refaddr( $obj ) eq refaddr( $result ) ) { + encode_error( sprintf( + "%s::TO_JSON method returned same object as was passed instead of a new one", + ref $obj + ) ); + } + } + + return $self->object_to_json( $result ); + } + + return "$obj" if ( $bignum and _is_bignum($obj) ); + return $self->blessed_to_json($obj) if ($allow_blessed and $as_nonblessed); # will be removed. + + encode_error( sprintf("encountered object '%s', but neither allow_blessed " + . "nor convert_blessed settings are enabled", $obj) + ) unless ($allow_blessed); + + return 'null'; + } + else { + return $self->value_to_json($obj); + } + } + else{ + return $self->value_to_json($obj); + } + } + + + sub hash_to_json { + my ($self, $obj) = @_; + my @res; + + encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)") + if (++$depth > $max_depth); + + my ($pre, $post) = $indent ? $self->_up_indent() : ('', ''); + my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : ''); + + for my $k ( _sort( $obj ) ) { + if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized + push @res, string_to_json( $self, $k ) + . $del + . ( $self->object_to_json( $obj->{$k} ) || $self->value_to_json( $obj->{$k} ) ); + } + + --$depth; + $self->_down_indent() if ($indent); + + return '{' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . '}'; + } + + + sub array_to_json { + my ($self, $obj) = @_; + my @res; + + encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)") + if (++$depth > $max_depth); + + my ($pre, $post) = $indent ? $self->_up_indent() : ('', ''); + + for my $v (@$obj){ + push @res, $self->object_to_json($v) || $self->value_to_json($v); + } + + --$depth; + $self->_down_indent() if ($indent); + + return '[' . ( @res ? $pre : '' ) . ( @res ? join( ",$pre", @res ) . $post : '' ) . ']'; + } + + + sub value_to_json { + my ($self, $value) = @_; + + return 'null' if(!defined $value); + + my $b_obj = B::svref_2object(\$value); # for round trip problem + my $flags = $b_obj->FLAGS; + + return $value # as is + if $flags & ( B::SVp_IOK | B::SVp_NOK ) and !( $flags & B::SVp_POK ); # SvTYPE is IV or NV? + + my $type = ref($value); + + if(!$type){ + return string_to_json($self, $value); + } + elsif( blessed($value) and $value->isa('JSON::PP::Boolean') ){ + return $$value == 1 ? 'true' : 'false'; + } + elsif ($type) { + if ((overload::StrVal($value) =~ /=(\w+)/)[0]) { + return $self->value_to_json("$value"); + } + + if ($type eq 'SCALAR' and defined $$value) { + return $$value eq '1' ? 'true' + : $$value eq '0' ? 'false' + : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null' + : encode_error("cannot encode reference to scalar"); + } + + if ( $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ) { + return 'null'; + } + else { + if ( $type eq 'SCALAR' or $type eq 'REF' ) { + encode_error("cannot encode reference to scalar"); + } + else { + encode_error("encountered $value, but JSON can only represent references to arrays or hashes"); + } + } + + } + else { + return $self->{fallback}->($value) + if ($self->{fallback} and ref($self->{fallback}) eq 'CODE'); + return 'null'; + } + + } + + + my %esc = ( + "\n" => '\n', + "\r" => '\r', + "\t" => '\t', + "\f" => '\f', + "\b" => '\b', + "\"" => '\"', + "\\" => '\\\\', + "\'" => '\\\'', + ); + + + sub string_to_json { + my ($self, $arg) = @_; + + $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g; + $arg =~ s/\//\\\//g if ($escape_slash); + $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg; + + if ($ascii) { + $arg = JSON_PP_encode_ascii($arg); + } + + if ($latin1) { + $arg = JSON_PP_encode_latin1($arg); + } + + if ($utf8) { + utf8::encode($arg); + } + + return '"' . $arg . '"'; + } + + + sub blessed_to_json { + my $reftype = reftype($_[1]) || ''; + if ($reftype eq 'HASH') { + return $_[0]->hash_to_json($_[1]); + } + elsif ($reftype eq 'ARRAY') { + return $_[0]->array_to_json($_[1]); + } + else { + return 'null'; + } + } + + + sub encode_error { + my $error = shift; + Carp::croak "$error"; + } + + + sub _sort { + defined $keysort ? (sort $keysort (keys %{$_[0]})) : keys %{$_[0]}; + } + + + sub _up_indent { + my $self = shift; + my $space = ' ' x $indent_length; + + my ($pre,$post) = ('',''); + + $post = "\n" . $space x $indent_count; + + $indent_count++; + + $pre = "\n" . $space x $indent_count; + + return ($pre,$post); + } + + + sub _down_indent { $indent_count--; } + + + sub PP_encode_box { + { + depth => $depth, + indent_count => $indent_count, + }; + } + + } # Convert + + + sub _encode_ascii { + join('', + map { + $_ <= 127 ? + chr($_) : + $_ <= 65535 ? + sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_)); + } unpack('U*', $_[0]) + ); + } + + + sub _encode_latin1 { + join('', + map { + $_ <= 255 ? + chr($_) : + $_ <= 65535 ? + sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_)); + } unpack('U*', $_[0]) + ); + } + + + sub _encode_surrogates { # from perlunicode + my $uni = $_[0] - 0x10000; + return ($uni / 0x400 + 0xD800, $uni % 0x400 + 0xDC00); + } + + + sub _is_bignum { + $_[0]->isa('Math::BigInt') or $_[0]->isa('Math::BigFloat'); + } + + + + # + # JSON => Perl + # + + my $max_intsize; + + BEGIN { + my $checkint = 1111; + for my $d (5..64) { + $checkint .= 1; + my $int = eval qq| $checkint |; + if ($int =~ /[eE]/) { + $max_intsize = $d - 1; + last; + } + } + } + + { # PARSE + + my %escapes = ( # by Jeremy Muhlich <jmuhlich [at] bitflood.org> + b => "\x8", + t => "\x9", + n => "\xA", + f => "\xC", + r => "\xD", + '\\' => '\\', + '"' => '"', + '/' => '/', + ); + + my $text; # json data + my $at; # offset + my $ch; # 1chracter + my $len; # text length (changed according to UTF8 or NON UTF8) + # INTERNAL + my $depth; # nest counter + my $encoding; # json text encoding + my $is_valid_utf8; # temp variable + my $utf8_len; # utf8 byte length + # FLAGS + my $utf8; # must be utf8 + my $max_depth; # max nest nubmer of objects and arrays + my $max_size; + my $relaxed; + my $cb_object; + my $cb_sk_object; + + my $F_HOOK; + + my $allow_bigint; # using Math::BigInt + my $singlequote; # loosely quoting + my $loose; # + my $allow_barekey; # bareKey + + # $opt flag + # 0x00000001 .... decode_prefix + # 0x10000000 .... incr_parse + + sub PP_decode_json { + my ($self, $opt); # $opt is an effective flag during this decode_json. + + ($self, $text, $opt) = @_; + + ($at, $ch, $depth) = (0, '', 0); + + if ( !defined $text or ref $text ) { + decode_error("malformed JSON string, neither array, object, number, string or atom"); + } + + my $idx = $self->{PROPS}; + + ($utf8, $relaxed, $loose, $allow_bigint, $allow_barekey, $singlequote) + = @{$idx}[P_UTF8, P_RELAXED, P_LOOSE .. P_ALLOW_SINGLEQUOTE]; + + if ( $utf8 ) { + utf8::downgrade( $text, 1 ) or Carp::croak("Wide character in subroutine entry"); + } + else { + utf8::upgrade( $text ); + } + + $len = length $text; + + ($max_depth, $max_size, $cb_object, $cb_sk_object, $F_HOOK) + = @{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/}; + + if ($max_size > 1) { + use bytes; + my $bytes = length $text; + decode_error( + sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s" + , $bytes, $max_size), 1 + ) if ($bytes > $max_size); + } + + # Currently no effect + # should use regexp + my @octets = unpack('C4', $text); + $encoding = ( $octets[0] and $octets[1]) ? 'UTF-8' + : (!$octets[0] and $octets[1]) ? 'UTF-16BE' + : (!$octets[0] and !$octets[1]) ? 'UTF-32BE' + : ( $octets[2] ) ? 'UTF-16LE' + : (!$octets[2] ) ? 'UTF-32LE' + : 'unknown'; + + white(); # remove head white space + + my $valid_start = defined $ch; # Is there a first character for JSON structure? + + my $result = value(); + + return undef if ( !$result && ( $opt & 0x10000000 ) ); # for incr_parse + + decode_error("malformed JSON string, neither array, object, number, string or atom") unless $valid_start; + + if ( !$idx->[ P_ALLOW_NONREF ] and !ref $result ) { + decode_error( + 'JSON text must be an object or array (but found number, string, true, false or null,' + . ' use allow_nonref to allow this)', 1); + } + + Carp::croak('something wrong.') if $len < $at; # we won't arrive here. + + my $consumed = defined $ch ? $at - 1 : $at; # consumed JSON text length + + white(); # remove tail white space + + if ( $ch ) { + return ( $result, $consumed ) if ($opt & 0x00000001); # all right if decode_prefix + decode_error("garbage after JSON object"); + } + + ( $opt & 0x00000001 ) ? ( $result, $consumed ) : $result; + } + + + sub next_chr { + return $ch = undef if($at >= $len); + $ch = substr($text, $at++, 1); + } + + + sub value { + white(); + return if(!defined $ch); + return object() if($ch eq '{'); + return array() if($ch eq '['); + return string() if($ch eq '"' or ($singlequote and $ch eq "'")); + return number() if($ch =~ /[0-9]/ or $ch eq '-'); + return word(); + } + + sub string { + my ($i, $s, $t, $u); + my $utf16; + my $is_utf8; + + ($is_valid_utf8, $utf8_len) = ('', 0); + + $s = ''; # basically UTF8 flag on + + if($ch eq '"' or ($singlequote and $ch eq "'")){ + my $boundChar = $ch; + + OUTER: while( defined(next_chr()) ){ + + if($ch eq $boundChar){ + next_chr(); + + if ($utf16) { + decode_error("missing low surrogate character in surrogate pair"); + } + + utf8::decode($s) if($is_utf8); + + return $s; + } + elsif($ch eq '\\'){ + next_chr(); + if(exists $escapes{$ch}){ + $s .= $escapes{$ch}; + } + elsif($ch eq 'u'){ # UNICODE handling + my $u = ''; + + for(1..4){ + $ch = next_chr(); + last OUTER if($ch !~ /[0-9a-fA-F]/); + $u .= $ch; + } + + # U+D800 - U+DBFF + if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/) { # UTF-16 high surrogate? + $utf16 = $u; + } + # U+DC00 - U+DFFF + elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/) { # UTF-16 low surrogate? + unless (defined $utf16) { + decode_error("missing high surrogate character in surrogate pair"); + } + $is_utf8 = 1; + $s .= JSON_PP_decode_surrogates($utf16, $u) || next; + $utf16 = undef; + } + else { + if (defined $utf16) { + decode_error("surrogate pair expected"); + } + + if ( ( my $hex = hex( $u ) ) > 127 ) { + $is_utf8 = 1; + $s .= JSON_PP_decode_unicode($u) || next; + } + else { + $s .= chr $hex; + } + } + + } + else{ + unless ($loose) { + $at -= 2; + decode_error('illegal backslash escape sequence in string'); + } + $s .= $ch; + } + } + else{ + + if ( ord $ch > 127 ) { + if ( $utf8 ) { + unless( $ch = is_valid_utf8($ch) ) { + $at -= 1; + decode_error("malformed UTF-8 character in JSON string"); + } + else { + $at += $utf8_len - 1; + } + } + else { + utf8::encode( $ch ); + } + + $is_utf8 = 1; + } + + if (!$loose) { + if ($ch =~ /[\x00-\x1f\x22\x5c]/) { # '/' ok + $at--; + decode_error('invalid character encountered while parsing JSON string'); + } + } + + $s .= $ch; + } + } + } + + decode_error("unexpected end of string while parsing JSON string"); + } + + + sub white { + while( defined $ch ){ + if($ch le ' '){ + next_chr(); + } + elsif($ch eq '/'){ + next_chr(); + if(defined $ch and $ch eq '/'){ + 1 while(defined(next_chr()) and $ch ne "\n" and $ch ne "\r"); + } + elsif(defined $ch and $ch eq '*'){ + next_chr(); + while(1){ + if(defined $ch){ + if($ch eq '*'){ + if(defined(next_chr()) and $ch eq '/'){ + next_chr(); + last; + } + } + else{ + next_chr(); + } + } + else{ + decode_error("Unterminated comment"); + } + } + next; + } + else{ + $at--; + decode_error("malformed JSON string, neither array, object, number, string or atom"); + } + } + else{ + if ($relaxed and $ch eq '#') { # correctly? + pos($text) = $at; + $text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g; + $at = pos($text); + next_chr; + next; + } + + last; + } + } + } + + + sub array { + my $a = $_[0] || []; # you can use this code to use another array ref object. + + decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)') + if (++$depth > $max_depth); + + next_chr(); + white(); + + if(defined $ch and $ch eq ']'){ + --$depth; + next_chr(); + return $a; + } + else { + while(defined($ch)){ + push @$a, value(); + + white(); + + if (!defined $ch) { + last; + } + + if($ch eq ']'){ + --$depth; + next_chr(); + return $a; + } + + if($ch ne ','){ + last; + } + + next_chr(); + white(); + + if ($relaxed and $ch eq ']') { + --$depth; + next_chr(); + return $a; + } + + } + } + + decode_error(", or ] expected while parsing array"); + } + + + sub object { + my $o = $_[0] || {}; # you can use this code to use another hash ref object. + my $k; + + decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)') + if (++$depth > $max_depth); + next_chr(); + white(); + + if(defined $ch and $ch eq '}'){ + --$depth; + next_chr(); + if ($F_HOOK) { + return _json_object_hook($o); + } + return $o; + } + else { + while (defined $ch) { + $k = ($allow_barekey and $ch ne '"' and $ch ne "'") ? bareKey() : string(); + white(); + + if(!defined $ch or $ch ne ':'){ + $at--; + decode_error("':' expected"); + } + + next_chr(); + $o->{$k} = value(); + white(); + + last if (!defined $ch); + + if($ch eq '}'){ + --$depth; + next_chr(); + if ($F_HOOK) { + return _json_object_hook($o); + } + return $o; + } + + if($ch ne ','){ + last; + } + + next_chr(); + white(); + + if ($relaxed and $ch eq '}') { + --$depth; + next_chr(); + if ($F_HOOK) { + return _json_object_hook($o); + } + return $o; + } + + } + + } + + $at--; + decode_error(", or } expected while parsing object/hash"); + } + + + sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition + my $key; + while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){ + $key .= $ch; + next_chr(); + } + return $key; + } + + + sub word { + my $word = substr($text,$at-1,4); + + if($word eq 'true'){ + $at += 3; + next_chr; + return $JSON::PP::true; + } + elsif($word eq 'null'){ + $at += 3; + next_chr; + return undef; + } + elsif($word eq 'fals'){ + $at += 3; + if(substr($text,$at,1) eq 'e'){ + $at++; + next_chr; + return $JSON::PP::false; + } + } + + $at--; # for decode_error report + + decode_error("'null' expected") if ($word =~ /^n/); + decode_error("'true' expected") if ($word =~ /^t/); + decode_error("'false' expected") if ($word =~ /^f/); + decode_error("malformed JSON string, neither array, object, number, string or atom"); + } + + + sub number { + my $n = ''; + my $v; + + # According to RFC4627, hex or oct digts are invalid. + if($ch eq '0'){ + my $peek = substr($text,$at,1); + my $hex = $peek =~ /[xX]/; # 0 or 1 + + if($hex){ + decode_error("malformed number (leading zero must not be followed by another digit)"); + ($n) = ( substr($text, $at+1) =~ /^([0-9a-fA-F]+)/); + } + else{ # oct + ($n) = ( substr($text, $at) =~ /^([0-7]+)/); + if (defined $n and length $n > 1) { + decode_error("malformed number (leading zero must not be followed by another digit)"); + } + } + + if(defined $n and length($n)){ + if (!$hex and length($n) == 1) { + decode_error("malformed number (leading zero must not be followed by another digit)"); + } + $at += length($n) + $hex; + next_chr; + return $hex ? hex($n) : oct($n); + } + } + + if($ch eq '-'){ + $n = '-'; + next_chr; + if (!defined $ch or $ch !~ /\d/) { + decode_error("malformed number (no digits after initial minus)"); + } + } + + while(defined $ch and $ch =~ /\d/){ + $n .= $ch; + next_chr; + } + + if(defined $ch and $ch eq '.'){ + $n .= '.'; + + next_chr; + if (!defined $ch or $ch !~ /\d/) { + decode_error("malformed number (no digits after decimal point)"); + } + else { + $n .= $ch; + } + + while(defined(next_chr) and $ch =~ /\d/){ + $n .= $ch; + } + } + + if(defined $ch and ($ch eq 'e' or $ch eq 'E')){ + $n .= $ch; + next_chr; + + if(defined($ch) and ($ch eq '+' or $ch eq '-')){ + $n .= $ch; + next_chr; + if (!defined $ch or $ch =~ /\D/) { + decode_error("malformed number (no digits after exp sign)"); + } + $n .= $ch; + } + elsif(defined($ch) and $ch =~ /\d/){ + $n .= $ch; + } + else { + decode_error("malformed number (no digits after exp sign)"); + } + + while(defined(next_chr) and $ch =~ /\d/){ + $n .= $ch; + } + + } + + $v .= $n; + + if ($v !~ /[.eE]/ and length $v > $max_intsize) { + if ($allow_bigint) { # from Adam Sussman + require Math::BigInt; + return Math::BigInt->new($v); + } + else { + return "$v"; + } + } + elsif ($allow_bigint) { + require Math::BigFloat; + return Math::BigFloat->new($v); + } + + return 0+$v; + } + + + sub is_valid_utf8 { + + $utf8_len = $_[0] =~ /[\x00-\x7F]/ ? 1 + : $_[0] =~ /[\xC2-\xDF]/ ? 2 + : $_[0] =~ /[\xE0-\xEF]/ ? 3 + : $_[0] =~ /[\xF0-\xF4]/ ? 4 + : 0 + ; + + return unless $utf8_len; + + my $is_valid_utf8 = substr($text, $at - 1, $utf8_len); + + return ( $is_valid_utf8 =~ /^(?: + [\x00-\x7F] + |[\xC2-\xDF][\x80-\xBF] + |[\xE0][\xA0-\xBF][\x80-\xBF] + |[\xE1-\xEC][\x80-\xBF][\x80-\xBF] + |[\xED][\x80-\x9F][\x80-\xBF] + |[\xEE-\xEF][\x80-\xBF][\x80-\xBF] + |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF] + |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF] + |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF] + )$/x ) ? $is_valid_utf8 : ''; + } + + + sub decode_error { + my $error = shift; + my $no_rep = shift; + my $str = defined $text ? substr($text, $at) : ''; + my $mess = ''; + my $type = $] >= 5.008 ? 'U*' + : $] < 5.006 ? 'C*' + : utf8::is_utf8( $str ) ? 'U*' # 5.6 + : 'C*' + ; + + for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ? + $mess .= $c == 0x07 ? '\a' + : $c == 0x09 ? '\t' + : $c == 0x0a ? '\n' + : $c == 0x0d ? '\r' + : $c == 0x0c ? '\f' + : $c < 0x20 ? sprintf('\x{%x}', $c) + : $c == 0x5c ? '\\\\' + : $c < 0x80 ? chr($c) + : sprintf('\x{%x}', $c) + ; + if ( length $mess >= 20 ) { + $mess .= '...'; + last; + } + } + + unless ( length $mess ) { + $mess = '(end of string)'; + } + + Carp::croak ( + $no_rep ? "$error" : "$error, at character offset $at (before \"$mess\")" + ); + + } + + + sub _json_object_hook { + my $o = $_[0]; + my @ks = keys %{$o}; + + if ( $cb_sk_object and @ks == 1 and exists $cb_sk_object->{ $ks[0] } and ref $cb_sk_object->{ $ks[0] } ) { + my @val = $cb_sk_object->{ $ks[0] }->( $o->{$ks[0]} ); + if (@val == 1) { + return $val[0]; + } + } + + my @val = $cb_object->($o) if ($cb_object); + if (@val == 0 or @val > 1) { + return $o; + } + else { + return $val[0]; + } + } + + + sub PP_decode_box { + { + text => $text, + at => $at, + ch => $ch, + len => $len, + depth => $depth, + encoding => $encoding, + is_valid_utf8 => $is_valid_utf8, + }; + } + + } # PARSE + + + sub _decode_surrogates { # from perlunicode + my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00); + my $un = pack('U*', $uni); + utf8::encode( $un ); + return $un; + } + + + sub _decode_unicode { + my $un = pack('U', hex shift); + utf8::encode( $un ); + return $un; + } + + # + # Setup for various Perl versions (the code from JSON::PP58) + # + + BEGIN { + + unless ( defined &utf8::is_utf8 ) { + require Encode; + *utf8::is_utf8 = *Encode::is_utf8; + } + + if ( $] >= 5.008 ) { + *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii; + *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1; + *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates; + *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode; + } + + if ($] >= 5.008 and $] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken. + package JSON::PP; + require subs; + subs->import('join'); + eval q| + sub join { + return '' if (@_ < 2); + my $j = shift; + my $str = shift; + for (@_) { $str .= $j . $_; } + return $str; + } + |; + } + + + sub JSON::PP::incr_parse { + local $Carp::CarpLevel = 1; + ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ ); + } + + + sub JSON::PP::incr_skip { + ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip; + } + + + sub JSON::PP::incr_reset { + ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset; + } + + eval q{ + sub JSON::PP::incr_text : lvalue { + $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new; + + if ( $_[0]->{_incr_parser}->{incr_parsing} ) { + Carp::croak("incr_text can not be called when the incremental parser already started parsing"); + } + $_[0]->{_incr_parser}->{incr_text}; + } + } if ( $] >= 5.006 ); + + } # Setup for various Perl versions (the code from JSON::PP58) + + + ############################### + # Utilities + # + + BEGIN { + eval 'require Scalar::Util'; + unless($@){ + *JSON::PP::blessed = \&Scalar::Util::blessed; + *JSON::PP::reftype = \&Scalar::Util::reftype; + *JSON::PP::refaddr = \&Scalar::Util::refaddr; + } + else{ # This code is from Sclar::Util. + # warn $@; + eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }'; + *JSON::PP::blessed = sub { + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef; + }; + my %tmap = qw( + B::NULL SCALAR + B::HV HASH + B::AV ARRAY + B::CV CODE + B::IO IO + B::GV GLOB + B::REGEXP REGEXP + ); + *JSON::PP::reftype = sub { + my $r = shift; + + return undef unless length(ref($r)); + + my $t = ref(B::svref_2object($r)); + + return + exists $tmap{$t} ? $tmap{$t} + : length(ref($$r)) ? 'REF' + : 'SCALAR'; + }; + *JSON::PP::refaddr = sub { + return undef unless length(ref($_[0])); + + my $addr; + if(defined(my $pkg = blessed($_[0]))) { + $addr .= bless $_[0], 'Scalar::Util::Fake'; + bless $_[0], $pkg; + } + else { + $addr .= $_[0] + } + + $addr =~ /0x(\w+)/; + local $^W; + #no warnings 'portable'; + hex($1); + } + } + } + + + # shamely copied and modified from JSON::XS code. + + $JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" }; + $JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" }; + + sub is_bool { defined $_[0] and UNIVERSAL::isa($_[0], "JSON::PP::Boolean"); } + + sub true { $JSON::PP::true } + sub false { $JSON::PP::false } + sub null { undef; } + + ############################### + + package JSON::PP::Boolean; + + use overload ( + "0+" => sub { ${$_[0]} }, + "++" => sub { $_[0] = ${$_[0]} + 1 }, + "--" => sub { $_[0] = ${$_[0]} - 1 }, + fallback => 1, + ); + + + ############################### + + package JSON::PP::IncrParser; + + use strict; + + use constant INCR_M_WS => 0; # initial whitespace skipping + use constant INCR_M_STR => 1; # inside string + use constant INCR_M_BS => 2; # inside backslash + use constant INCR_M_JSON => 3; # outside anything, count nesting + use constant INCR_M_C0 => 4; + use constant INCR_M_C1 => 5; + + $JSON::PP::IncrParser::VERSION = '1.01'; + + my $unpack_format = $] < 5.006 ? 'C*' : 'U*'; + + sub new { + my ( $class ) = @_; + + bless { + incr_nest => 0, + incr_text => undef, + incr_parsing => 0, + incr_p => 0, + }, $class; + } + + + sub incr_parse { + my ( $self, $coder, $text ) = @_; + + $self->{incr_text} = '' unless ( defined $self->{incr_text} ); + + if ( defined $text ) { + if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) { + utf8::upgrade( $self->{incr_text} ) ; + utf8::decode( $self->{incr_text} ) ; + } + $self->{incr_text} .= $text; + } + + + my $max_size = $coder->get_max_size; + + if ( defined wantarray ) { + + $self->{incr_mode} = INCR_M_WS unless defined $self->{incr_mode}; + + if ( wantarray ) { + my @ret; + + $self->{incr_parsing} = 1; + + do { + push @ret, $self->_incr_parse( $coder, $self->{incr_text} ); + + unless ( !$self->{incr_nest} and $self->{incr_mode} == INCR_M_JSON ) { + $self->{incr_mode} = INCR_M_WS if $self->{incr_mode} != INCR_M_STR; + } + + } until ( length $self->{incr_text} >= $self->{incr_p} ); + + $self->{incr_parsing} = 0; + + return @ret; + } + else { # in scalar context + $self->{incr_parsing} = 1; + my $obj = $self->_incr_parse( $coder, $self->{incr_text} ); + $self->{incr_parsing} = 0 if defined $obj; # pointed by Martin J. Evans + return $obj ? $obj : undef; # $obj is an empty string, parsing was completed. + } + + } + + } + + + sub _incr_parse { + my ( $self, $coder, $text, $skip ) = @_; + my $p = $self->{incr_p}; + my $restore = $p; + + my @obj; + my $len = length $text; + + if ( $self->{incr_mode} == INCR_M_WS ) { + while ( $len > $p ) { + my $s = substr( $text, $p, 1 ); + $p++ and next if ( 0x20 >= unpack($unpack_format, $s) ); + $self->{incr_mode} = INCR_M_JSON; + last; + } + } + + while ( $len > $p ) { + my $s = substr( $text, $p++, 1 ); + + if ( $s eq '"' ) { + if (substr( $text, $p - 2, 1 ) eq '\\' ) { + next; + } + + if ( $self->{incr_mode} != INCR_M_STR ) { + $self->{incr_mode} = INCR_M_STR; + } + else { + $self->{incr_mode} = INCR_M_JSON; + unless ( $self->{incr_nest} ) { + last; + } + } + } + + if ( $self->{incr_mode} == INCR_M_JSON ) { + + if ( $s eq '[' or $s eq '{' ) { + if ( ++$self->{incr_nest} > $coder->get_max_depth ) { + Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)'); + } + } + elsif ( $s eq ']' or $s eq '}' ) { + last if ( --$self->{incr_nest} <= 0 ); + } + elsif ( $s eq '#' ) { + while ( $len > $p ) { + last if substr( $text, $p++, 1 ) eq "\n"; + } + } + + } + + } + + $self->{incr_p} = $p; + + return if ( $self->{incr_mode} == INCR_M_STR and not $self->{incr_nest} ); + return if ( $self->{incr_mode} == INCR_M_JSON and $self->{incr_nest} > 0 ); + + return '' unless ( length substr( $self->{incr_text}, 0, $p ) ); + + local $Carp::CarpLevel = 2; + + $self->{incr_p} = $restore; + $self->{incr_c} = $p; + + my ( $obj, $tail ) = $coder->PP_decode_json( substr( $self->{incr_text}, 0, $p ), 0x10000001 ); + + $self->{incr_text} = substr( $self->{incr_text}, $p ); + $self->{incr_p} = 0; + + return $obj or ''; + } + + + sub incr_text { + if ( $_[0]->{incr_parsing} ) { + Carp::croak("incr_text can not be called when the incremental parser already started parsing"); + } + $_[0]->{incr_text}; + } + + + sub incr_skip { + my $self = shift; + $self->{incr_text} = substr( $self->{incr_text}, $self->{incr_c} ); + $self->{incr_p} = 0; + } + + + sub incr_reset { + my $self = shift; + $self->{incr_text} = undef; + $self->{incr_p} = 0; + $self->{incr_mode} = 0; + $self->{incr_nest} = 0; + $self->{incr_parsing} = 0; + } + + ############################### + + + 1; + __END__ + =pod + +JSON_PP + +$fatpacked{"JSON/PP/Boolean.pm"} = <<'JSON_PP_BOOLEAN'; + use JSON::PP (); + use strict; + + 1; + +JSON_PP_BOOLEAN + +$fatpacked{"Module/Metadata.pm"} = <<'MODULE_METADATA'; + # -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*- + # vim:ts=8:sw=2:et:sta:sts=2 + package Module::Metadata; + + # Adapted from Perl-licensed code originally distributed with + # Module-Build by Ken Williams + + # This module provides routines to gather information about + # perl modules (assuming this may be expanded in the distant + # parrot future to look at other types of modules). + + use strict; + use vars qw($VERSION); + $VERSION = '1.000007'; + $VERSION = eval $VERSION; + + use File::Spec; + use IO::File; + use version 0.87; + BEGIN { + if ($INC{'Log/Contextual.pm'}) { + Log::Contextual->import('log_info'); + } else { + *log_info = sub (&) { warn $_[0]->() }; + } + } + use File::Find qw(find); + + my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal + + my $PKG_REGEXP = qr{ # match a package declaration + ^[\s\{;]* # intro chars on a line + package # the word 'package' + \s+ # whitespace + ([\w:]+) # a package name + \s* # optional whitespace + ($V_NUM_REGEXP)? # optional version number + \s* # optional whitesapce + [;\{] # semicolon line terminator or block start (since 5.16) + }x; + + my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name + ([\$*]) # sigil - $ or * + ( + ( # optional leading package name + (?:::|\')? # possibly starting like just :: (Ì la $::VERSION) + (?:\w+(?:::|\'))* # Foo::Bar:: ... + )? + VERSION + )\b + }x; + + my $VERS_REGEXP = qr{ # match a VERSION definition + (?: + \(\s*$VARNAME_REGEXP\s*\) # with parens + | + $VARNAME_REGEXP # without parens + ) + \s* + =[^=~] # = but not ==, nor =~ + }x; + + + sub new_from_file { + my $class = shift; + my $filename = File::Spec->rel2abs( shift ); + + return undef unless defined( $filename ) && -f $filename; + return $class->_init(undef, $filename, @_); + } + + sub new_from_handle { + my $class = shift; + my $handle = shift; + my $filename = shift; + return undef unless defined($handle) && defined($filename); + $filename = File::Spec->rel2abs( $filename ); + + return $class->_init(undef, $filename, @_, handle => $handle); + + } + + + sub new_from_module { + my $class = shift; + my $module = shift; + my %props = @_; + + $props{inc} ||= \@INC; + my $filename = $class->find_module_by_name( $module, $props{inc} ); + return undef unless defined( $filename ) && -f $filename; + return $class->_init($module, $filename, %props); + } + + { + + my $compare_versions = sub { + my ($v1, $op, $v2) = @_; + $v1 = version->new($v1) + unless UNIVERSAL::isa($v1,'version'); + + my $eval_str = "\$v1 $op \$v2"; + my $result = eval $eval_str; + log_info { "error comparing versions: '$eval_str' $@" } if $@; + + return $result; + }; + + my $normalize_version = sub { + my ($version) = @_; + if ( $version =~ /[=<>!,]/ ) { # logic, not just version + # take as is without modification + } + elsif ( ref $version eq 'version' ) { # version objects + $version = $version->is_qv ? $version->normal : $version->stringify; + } + elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots + # normalize string tuples without "v": "1.2.3" -> "v1.2.3" + $version = "v$version"; + } + else { + # leave alone + } + return $version; + }; + + # separate out some of the conflict resolution logic + + my $resolve_module_versions = sub { + my $packages = shift; + + my( $file, $version ); + my $err = ''; + foreach my $p ( @$packages ) { + if ( defined( $p->{version} ) ) { + if ( defined( $version ) ) { + if ( $compare_versions->( $version, '!=', $p->{version} ) ) { + $err .= " $p->{file} ($p->{version})\n"; + } else { + # same version declared multiple times, ignore + } + } else { + $file = $p->{file}; + $version = $p->{version}; + } + } + $file ||= $p->{file} if defined( $p->{file} ); + } + + if ( $err ) { + $err = " $file ($version)\n" . $err; + } + + my %result = ( + file => $file, + version => $version, + err => $err + ); + + return \%result; + }; + + sub package_versions_from_directory { + my ( $class, $dir, $files ) = @_; + + my @files; + + if ( $files ) { + @files = @$files; + } else { + find( { + wanted => sub { + push @files, $_ if -f $_ && /\.pm$/; + }, + no_chdir => 1, + }, $dir ); + } + + # First, we enumerate all packages & versions, + # separating into primary & alternative candidates + my( %prime, %alt ); + foreach my $file (@files) { + my $mapped_filename = File::Spec->abs2rel( $file, $dir ); + my @path = split( /\//, $mapped_filename ); + (my $prime_package = join( '::', @path )) =~ s/\.pm$//; + + my $pm_info = $class->new_from_file( $file ); + + foreach my $package ( $pm_info->packages_inside ) { + next if $package eq 'main'; # main can appear numerous times, ignore + next if $package eq 'DB'; # special debugging package, ignore + next if grep /^_/, split( /::/, $package ); # private package, ignore + + my $version = $pm_info->version( $package ); + + if ( $package eq $prime_package ) { + if ( exists( $prime{$package} ) ) { + die "Unexpected conflict in '$package'; multiple versions found.\n"; + } else { + $prime{$package}{file} = $mapped_filename; + $prime{$package}{version} = $version if defined( $version ); + } + } else { + push( @{$alt{$package}}, { + file => $mapped_filename, + version => $version, + } ); + } + } + } + + # Then we iterate over all the packages found above, identifying conflicts + # and selecting the "best" candidate for recording the file & version + # for each package. + foreach my $package ( keys( %alt ) ) { + my $result = $resolve_module_versions->( $alt{$package} ); + + if ( exists( $prime{$package} ) ) { # primary package selected + + if ( $result->{err} ) { + # Use the selected primary package, but there are conflicting + # errors among multiple alternative packages that need to be + # reported + log_info { + "Found conflicting versions for package '$package'\n" . + " $prime{$package}{file} ($prime{$package}{version})\n" . + $result->{err} + }; + + } elsif ( defined( $result->{version} ) ) { + # There is a primary package selected, and exactly one + # alternative package + + if ( exists( $prime{$package}{version} ) && + defined( $prime{$package}{version} ) ) { + # Unless the version of the primary package agrees with the + # version of the alternative package, report a conflict + if ( $compare_versions->( + $prime{$package}{version}, '!=', $result->{version} + ) + ) { + + log_info { + "Found conflicting versions for package '$package'\n" . + " $prime{$package}{file} ($prime{$package}{version})\n" . + " $result->{file} ($result->{version})\n" + }; + } + + } else { + # The prime package selected has no version so, we choose to + # use any alternative package that does have a version + $prime{$package}{file} = $result->{file}; + $prime{$package}{version} = $result->{version}; + } + + } else { + # no alt package found with a version, but we have a prime + # package so we use it whether it has a version or not + } + + } else { # No primary package was selected, use the best alternative + + if ( $result->{err} ) { + log_info { + "Found conflicting versions for package '$package'\n" . + $result->{err} + }; + } + + # Despite possible conflicting versions, we choose to record + # something rather than nothing + $prime{$package}{file} = $result->{file}; + $prime{$package}{version} = $result->{version} + if defined( $result->{version} ); + } + } + + # Normalize versions. Can't use exists() here because of bug in YAML::Node. + # XXX "bug in YAML::Node" comment seems irrelvant -- dagolden, 2009-05-18 + for (grep defined $_->{version}, values %prime) { + $_->{version} = $normalize_version->( $_->{version} ); + } + + return \%prime; + } + } + + + sub _init { + my $class = shift; + my $module = shift; + my $filename = shift; + my %props = @_; + + my $handle = delete $props{handle}; + my( %valid_props, @valid_props ); + @valid_props = qw( collect_pod inc ); + @valid_props{@valid_props} = delete( @props{@valid_props} ); + warn "Unknown properties: @{[keys %props]}\n" if scalar( %props ); + + my %data = ( + module => $module, + filename => $filename, + version => undef, + packages => [], + versions => {}, + pod => {}, + pod_headings => [], + collect_pod => 0, + + %valid_props, + ); + + my $self = bless(\%data, $class); + + if ( $handle ) { + $self->_parse_fh($handle); + } + else { + $self->_parse_file(); + } + + unless($self->{module} and length($self->{module})) { + my ($v, $d, $f) = File::Spec->splitpath($self->{filename}); + if($f =~ /\.pm$/) { + $f =~ s/\..+$//; + my @candidates = grep /$f$/, @{$self->{packages}}; + $self->{module} = shift(@candidates); # punt + } + else { + if(grep /main/, @{$self->{packages}}) { + $self->{module} = 'main'; + } + else { + $self->{module} = $self->{packages}[0] || ''; + } + } + } + + $self->{version} = $self->{versions}{$self->{module}} + if defined( $self->{module} ); + + return $self; + } + + # class method + sub _do_find_module { + my $class = shift; + my $module = shift || die 'find_module_by_name() requires a package name'; + my $dirs = shift || \@INC; + + my $file = File::Spec->catfile(split( /::/, $module)); + foreach my $dir ( @$dirs ) { + my $testfile = File::Spec->catfile($dir, $file); + return [ File::Spec->rel2abs( $testfile ), $dir ] + if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp + return [ File::Spec->rel2abs( "$testfile.pm" ), $dir ] + if -e "$testfile.pm"; + } + return; + } + + # class method + sub find_module_by_name { + my $found = shift()->_do_find_module(@_) or return; + return $found->[0]; + } + + # class method + sub find_module_dir_by_name { + my $found = shift()->_do_find_module(@_) or return; + return $found->[1]; + } + + + # given a line of perl code, attempt to parse it if it looks like a + # $VERSION assignment, returning sigil, full name, & package name + sub _parse_version_expression { + my $self = shift; + my $line = shift; + + my( $sig, $var, $pkg ); + if ( $line =~ $VERS_REGEXP ) { + ( $sig, $var, $pkg ) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 ); + if ( $pkg ) { + $pkg = ($pkg eq '::') ? 'main' : $pkg; + $pkg =~ s/::$//; + } + } + + return ( $sig, $var, $pkg ); + } + + sub _parse_file { + my $self = shift; + + my $filename = $self->{filename}; + my $fh = IO::File->new( $filename ) + or die( "Can't open '$filename': $!" ); + + $self->_parse_fh($fh); + } + + sub _parse_fh { + my ($self, $fh) = @_; + + my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 ); + my( @pkgs, %vers, %pod, @pod ); + my $pkg = 'main'; + my $pod_sect = ''; + my $pod_data = ''; + + while (defined( my $line = <$fh> )) { + my $line_num = $.; + + chomp( $line ); + next if $line =~ /^\s*#/; + + $in_pod = ($line =~ /^=(?!cut)/) ? 1 : ($line =~ /^=cut/) ? 0 : $in_pod; + + # Would be nice if we could also check $in_string or something too + last if !$in_pod && $line =~ /^__(?:DATA|END)__$/; + + if ( $in_pod || $line =~ /^=cut/ ) { + + if ( $line =~ /^=head\d\s+(.+)\s*$/ ) { + push( @pod, $1 ); + if ( $self->{collect_pod} && length( $pod_data ) ) { + $pod{$pod_sect} = $pod_data; + $pod_data = ''; + } + $pod_sect = $1; + + + } elsif ( $self->{collect_pod} ) { + $pod_data .= "$line\n"; + + } + + } else { + + $pod_sect = ''; + $pod_data = ''; + + # parse $line to see if it's a $VERSION declaration + my( $vers_sig, $vers_fullname, $vers_pkg ) = + $self->_parse_version_expression( $line ); + + if ( $line =~ $PKG_REGEXP ) { + $pkg = $1; + push( @pkgs, $pkg ) unless grep( $pkg eq $_, @pkgs ); + $vers{$pkg} = (defined $2 ? $2 : undef) unless exists( $vers{$pkg} ); + $need_vers = defined $2 ? 0 : 1; + + # VERSION defined with full package spec, i.e. $Module::VERSION + } elsif ( $vers_fullname && $vers_pkg ) { + push( @pkgs, $vers_pkg ) unless grep( $vers_pkg eq $_, @pkgs ); + $need_vers = 0 if $vers_pkg eq $pkg; + + unless ( defined $vers{$vers_pkg} && length $vers{$vers_pkg} ) { + $vers{$vers_pkg} = + $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); + } else { + # Warn unless the user is using the "$VERSION = eval + # $VERSION" idiom (though there are probably other idioms + # that we should watch out for...) + warn <<"EOM" unless $line =~ /=\s*eval/; + Package '$vers_pkg' already declared with version '$vers{$vers_pkg}', + ignoring subsequent declaration on line $line_num. + EOM + } + + # first non-comment line in undeclared package main is VERSION + } elsif ( !exists($vers{main}) && $pkg eq 'main' && $vers_fullname ) { + $need_vers = 0; + my $v = + $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); + $vers{$pkg} = $v; + push( @pkgs, 'main' ); + + # first non-comment line in undeclared package defines package main + } elsif ( !exists($vers{main}) && $pkg eq 'main' && $line =~ /\w+/ ) { + $need_vers = 1; + $vers{main} = ''; + push( @pkgs, 'main' ); + + # only keep if this is the first $VERSION seen + } elsif ( $vers_fullname && $need_vers ) { + $need_vers = 0; + my $v = + $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); + + + unless ( defined $vers{$pkg} && length $vers{$pkg} ) { + $vers{$pkg} = $v; + } else { + warn <<"EOM"; + Package '$pkg' already declared with version '$vers{$pkg}' + ignoring new version '$v' on line $line_num. + EOM + } + + } + + } + + } + + if ( $self->{collect_pod} && length($pod_data) ) { + $pod{$pod_sect} = $pod_data; + } + + $self->{versions} = \%vers; + $self->{packages} = \@pkgs; + $self->{pod} = \%pod; + $self->{pod_headings} = \@pod; + } + + { + my $pn = 0; + sub _evaluate_version_line { + my $self = shift; + my( $sigil, $var, $line ) = @_; + + # Some of this code came from the ExtUtils:: hierarchy. + + # We compile into $vsub because 'use version' would cause + # compiletime/runtime issues with local() + my $vsub; + $pn++; # everybody gets their own package + my $eval = qq{BEGIN { q# Hide from _packages_inside() + #; package Module::Metadata::_version::p$pn; + use version; + no strict; + + \$vsub = sub { + local $sigil$var; + \$$var=undef; + $line; + \$$var + }; + }}; + + local $^W; + # Try to get the $VERSION + eval $eval; + # some modules say $VERSION = $Foo::Bar::VERSION, but Foo::Bar isn't + # installed, so we need to hunt in ./lib for it + if ( $@ =~ /Can't locate/ && -d 'lib' ) { + local @INC = ('lib',@INC); + eval $eval; + } + warn "Error evaling version line '$eval' in $self->{filename}: $@\n" + if $@; + (ref($vsub) eq 'CODE') or + die "failed to build version sub for $self->{filename}"; + my $result = eval { $vsub->() }; + die "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n" + if $@; + + # Upgrade it into a version object + my $version = eval { _dwim_version($result) }; + + die "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n" + unless defined $version; # "0" is OK! + + return $version; + } + } + + # Try to DWIM when things fail the lax version test in obvious ways + { + my @version_prep = ( + # Best case, it just works + sub { return shift }, + + # If we still don't have a version, try stripping any + # trailing junk that is prohibited by lax rules + sub { + my $v = shift; + $v =~ s{([0-9])[a-z-].*$}{$1}i; # 1.23-alpha or 1.23b + return $v; + }, + + # Activestate apparently creates custom versions like '1.23_45_01', which + # cause version.pm to think it's an invalid alpha. So check for that + # and strip them + sub { + my $v = shift; + my $num_dots = () = $v =~ m{(\.)}g; + my $num_unders = () = $v =~ m{(_)}g; + my $leading_v = substr($v,0,1) eq 'v'; + if ( ! $leading_v && $num_dots < 2 && $num_unders > 1 ) { + $v =~ s{_}{}g; + $num_unders = () = $v =~ m{(_)}g; + } + return $v; + }, + + # Worst case, try numifying it like we would have before version objects + sub { + my $v = shift; + no warnings 'numeric'; + return 0 + $v; + }, + + ); + + sub _dwim_version { + my ($result) = shift; + + return $result if ref($result) eq 'version'; + + my ($version, $error); + for my $f (@version_prep) { + $result = $f->($result); + $version = eval { version->new($result) }; + $error ||= $@ if $@; # capture first failure + last if defined $version; + } + + die $error unless defined $version; + + return $version; + } + } + + ############################################################ + + # accessors + sub name { $_[0]->{module} } + + sub filename { $_[0]->{filename} } + sub packages_inside { @{$_[0]->{packages}} } + sub pod_inside { @{$_[0]->{pod_headings}} } + sub contains_pod { $#{$_[0]->{pod_headings}} } + + sub version { + my $self = shift; + my $mod = shift || $self->{module}; + my $vers; + if ( defined( $mod ) && length( $mod ) && + exists( $self->{versions}{$mod} ) ) { + return $self->{versions}{$mod}; + } else { + return undef; + } + } + + sub pod { + my $self = shift; + my $sect = shift; + if ( defined( $sect ) && length( $sect ) && + exists( $self->{pod}{$sect} ) ) { + return $self->{pod}{$sect}; + } else { + return undef; + } + } + + 1; + +MODULE_METADATA + +$fatpacked{"Parse/CPAN/Meta.pm"} = <<'PARSE_CPAN_META'; + package Parse::CPAN::Meta;
+
+ use strict;
+ use Carp 'croak';
+
+ # UTF Support?
+ sub HAVE_UTF8 () { $] >= 5.007003 }
+ sub IO_LAYER () { $] >= 5.008001 ? ":utf8" : "" }
+
+ BEGIN {
+ if ( HAVE_UTF8 ) {
+ # The string eval helps hide this from Test::MinimumVersion
+ eval "require utf8;";
+ die "Failed to load UTF-8 support" if $@;
+ }
+
+ # Class structure
+ require 5.004;
+ require Exporter;
+ $Parse::CPAN::Meta::VERSION = '1.4401';
+ @Parse::CPAN::Meta::ISA = qw{ Exporter };
+ @Parse::CPAN::Meta::EXPORT_OK = qw{ Load LoadFile };
+ }
+
+ sub load_file {
+ my ($class, $filename) = @_;
+
+ if ($filename =~ /\.ya?ml$/) {
+ return $class->load_yaml_string(_slurp($filename));
+ }
+
+ if ($filename =~ /\.json$/) {
+ return $class->load_json_string(_slurp($filename));
+ }
+
+ croak("file type cannot be determined by filename");
+ }
+
+ sub load_yaml_string {
+ my ($class, $string) = @_;
+ my $backend = $class->yaml_backend();
+ my $data = eval { no strict 'refs'; &{"$backend\::Load"}($string) };
+ if ( $@ ) {
+ croak $backend->can('errstr') ? $backend->errstr : $@
+ }
+ return $data || {}; # in case document was valid but empty
+ }
+
+ sub load_json_string {
+ my ($class, $string) = @_;
+ return $class->json_backend()->new->decode($string);
+ }
+
+ sub yaml_backend {
+ local $Module::Load::Conditional::CHECK_INC_HASH = 1;
+ if (! defined $ENV{PERL_YAML_BACKEND} ) {
+ _can_load( 'CPAN::Meta::YAML', 0.002 )
+ or croak "CPAN::Meta::YAML 0.002 is not available\n";
+ return "CPAN::Meta::YAML";
+ }
+ else {
+ my $backend = $ENV{PERL_YAML_BACKEND};
+ _can_load( $backend )
+ or croak "Could not load PERL_YAML_BACKEND '$backend'\n";
+ $backend->can("Load")
+ or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n";
+ return $backend;
+ }
+ }
+
+ sub json_backend {
+ local $Module::Load::Conditional::CHECK_INC_HASH = 1;
+ if (! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') {
+ _can_load( 'JSON::PP' => 2.27103 )
+ or croak "JSON::PP 2.27103 is not available\n";
+ return 'JSON::PP';
+ }
+ else {
+ _can_load( 'JSON' => 2.5 )
+ or croak "JSON 2.5 is required for " .
+ "\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n";
+ return "JSON";
+ }
+ }
+
+ sub _slurp {
+ open my $fh, "<" . IO_LAYER, "$_[0]"
+ or die "can't open $_[0] for reading: $!";
+ return do { local $/; <$fh> };
+ }
+
+ sub _can_load {
+ my ($module, $version) = @_;
+ (my $file = $module) =~ s{::}{/}g;
+ $file .= ".pm";
+ return 1 if $INC{$file};
+ return 0 if exists $INC{$file}; # prior load failed
+ eval { require $file; 1 }
+ or return 0;
+ if ( defined $version ) {
+ eval { $module->VERSION($version); 1 }
+ or return 0;
+ }
+ return 1;
+ }
+
+ # Kept for backwards compatibility only
+ # Create an object from a file
+ sub LoadFile ($) {
+ require CPAN::Meta::YAML;
+ return CPAN::Meta::YAML::LoadFile(shift)
+ or die CPAN::Meta::YAML->errstr;
+ }
+
+ # Parse a document from a string.
+ sub Load ($) {
+ require CPAN::Meta::YAML;
+ return CPAN::Meta::YAML::Load(shift)
+ or die CPAN::Meta::YAML->errstr;
+ }
+
+ 1;
+
+ __END__
+
+PARSE_CPAN_META + +$fatpacked{"Try/Tiny.pm"} = <<'TRY_TINY'; + package Try::Tiny; + + use strict; + #use warnings; + + use vars qw(@EXPORT @EXPORT_OK $VERSION @ISA); + + BEGIN { + require Exporter; + @ISA = qw(Exporter); + } + + $VERSION = "0.09"; + + $VERSION = eval $VERSION; + + @EXPORT = @EXPORT_OK = qw(try catch finally); + + $Carp::Internal{+__PACKAGE__}++; + + # Need to prototype as @ not $$ because of the way Perl evaluates the prototype. + # Keeping it at $$ means you only ever get 1 sub because we need to eval in a list + # context & not a scalar one + + sub try (&;@) { + my ( $try, @code_refs ) = @_; + + # we need to save this here, the eval block will be in scalar context due + # to $failed + my $wantarray = wantarray; + + my ( $catch, @finally ); + + # find labeled blocks in the argument list. + # catch and finally tag the blocks by blessing a scalar reference to them. + foreach my $code_ref (@code_refs) { + next unless $code_ref; + + my $ref = ref($code_ref); + + if ( $ref eq 'Try::Tiny::Catch' ) { + $catch = ${$code_ref}; + } elsif ( $ref eq 'Try::Tiny::Finally' ) { + push @finally, ${$code_ref}; + } else { + use Carp; + confess("Unknown code ref type given '${ref}'. Check your usage & try again"); + } + } + + # save the value of $@ so we can set $@ back to it in the beginning of the eval + my $prev_error = $@; + + my ( @ret, $error, $failed ); + + # FIXME consider using local $SIG{__DIE__} to accumulate all errors. It's + # not perfect, but we could provide a list of additional errors for + # $catch->(); + + { + # localize $@ to prevent clobbering of previous value by a successful + # eval. + local $@; + + # failed will be true if the eval dies, because 1 will not be returned + # from the eval body + $failed = not eval { + $@ = $prev_error; + + # evaluate the try block in the correct context + if ( $wantarray ) { + @ret = $try->(); + } elsif ( defined $wantarray ) { + $ret[0] = $try->(); + } else { + $try->(); + }; + + return 1; # properly set $fail to false + }; + + # copy $@ to $error; when we leave this scope, local $@ will revert $@ + # back to its previous value + $error = $@; + } + + # set up a scope guard to invoke the finally block at the end + my @guards = + map { Try::Tiny::ScopeGuard->_new($_, $failed ? $error : ()) } + @finally; + + # at this point $failed contains a true value if the eval died, even if some + # destructor overwrote $@ as the eval was unwinding. + if ( $failed ) { + # if we got an error, invoke the catch block. + if ( $catch ) { + # This works like given($error), but is backwards compatible and + # sets $_ in the dynamic scope for the body of C<$catch> + for ($error) { + return $catch->($error); + } + + # in case when() was used without an explicit return, the C<for> + # loop will be aborted and there's no useful return value + } + + return; + } else { + # no failure, $@ is back to what it was, everything is fine + return $wantarray ? @ret : $ret[0]; + } + } + + sub catch (&;@) { + my ( $block, @rest ) = @_; + + return ( + bless(\$block, 'Try::Tiny::Catch'), + @rest, + ); + } + + sub finally (&;@) { + my ( $block, @rest ) = @_; + + return ( + bless(\$block, 'Try::Tiny::Finally'), + @rest, + ); + } + + { + package # hide from PAUSE + Try::Tiny::ScopeGuard; + + sub _new { + shift; + bless [ @_ ]; + } + + sub DESTROY { + my @guts = @{ shift() }; + my $code = shift @guts; + $code->(@guts); + } + } + + __PACKAGE__ + + __END__ + +TRY_TINY + +$fatpacked{"lib/core/only.pm"} = <<'LIB_CORE_ONLY'; + package lib::core::only; + + use strict; + use warnings FATAL => 'all'; + use Config; + + sub import { + @INC = @Config{qw(privlibexp archlibexp)}; + return + } + + 1; +LIB_CORE_ONLY + +$fatpacked{"local/lib.pm"} = <<'LOCAL_LIB'; + use strict; + use warnings; + + package local::lib; + + use 5.008001; # probably works with earlier versions but I'm not supporting them + # (patches would, of course, be welcome) + + use File::Spec (); + use File::Path (); + use Carp (); + use Config; + + our $VERSION = '1.008001'; # 1.8.1 + + our @KNOWN_FLAGS = qw(--self-contained); + + sub import { + my ($class, @args) = @_; + + # Remember what PERL5LIB was when we started + my $perl5lib = $ENV{PERL5LIB} || ''; + + my %arg_store; + for my $arg (@args) { + # check for lethal dash first to stop processing before causing problems + if ($arg =~ /−/) { + die <<'DEATH'; + WHOA THERE! It looks like you've got some fancy dashes in your commandline! + These are *not* the traditional -- dashes that software recognizes. You + probably got these by copy-pasting from the perldoc for this module as + rendered by a UTF8-capable formatter. This most typically happens on an OS X + terminal, but can happen elsewhere too. Please try again after replacing the + dashes with normal minus signs. + DEATH + } + elsif(grep { $arg eq $_ } @KNOWN_FLAGS) { + (my $flag = $arg) =~ s/--//; + $arg_store{$flag} = 1; + } + elsif($arg =~ /^--/) { + die "Unknown import argument: $arg"; + } + else { + # assume that what's left is a path + $arg_store{path} = $arg; + } + } + + if($arg_store{'self-contained'}) { + die "FATAL: The local::lib --self-contained flag has never worked reliably and the original author, Mark Stosberg, was unable or unwilling to maintain it. As such, this flag has been removed from the local::lib codebase in order to prevent misunderstandings and potentially broken builds. The local::lib authors recommend that you look at the lib::core::only module shipped with this distribution in order to create a more robust environment that is equivalent to what --self-contained provided (although quite possibly not what you originally thought it provided due to the poor quality of the documentation, for which we apologise).\n"; + } + + $arg_store{path} = $class->resolve_path($arg_store{path}); + $class->setup_local_lib_for($arg_store{path}); + + for (@INC) { # Untaint @INC + next if ref; # Skip entry if it is an ARRAY, CODE, blessed, etc. + m/(.*)/ and $_ = $1; + } + } + + sub pipeline; + + sub pipeline { + my @methods = @_; + my $last = pop(@methods); + if (@methods) { + \sub { + my ($obj, @args) = @_; + $obj->${pipeline @methods}( + $obj->$last(@args) + ); + }; + } else { + \sub { + shift->$last(@_); + }; + } + } + + sub _uniq { + my %seen; + grep { ! $seen{$_}++ } @_; + } + + sub resolve_path { + my ($class, $path) = @_; + $class->${pipeline qw( + resolve_relative_path + resolve_home_path + resolve_empty_path + )}($path); + } + + sub resolve_empty_path { + my ($class, $path) = @_; + if (defined $path) { + $path; + } else { + '~/perl5'; + } + } + + sub resolve_home_path { + my ($class, $path) = @_; + return $path unless ($path =~ /^~/); + my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us' + my $tried_file_homedir; + my $homedir = do { + if (eval { require File::HomeDir } && $File::HomeDir::VERSION >= 0.65) { + $tried_file_homedir = 1; + if (defined $user) { + File::HomeDir->users_home($user); + } else { + File::HomeDir->my_home; + } + } else { + if (defined $user) { + (getpwnam $user)[7]; + } else { + if (defined $ENV{HOME}) { + $ENV{HOME}; + } else { + (getpwuid $<)[7]; + } + } + } + }; + unless (defined $homedir) { + Carp::croak( + "Couldn't resolve homedir for " + .(defined $user ? $user : 'current user') + .($tried_file_homedir ? '' : ' - consider installing File::HomeDir') + ); + } + $path =~ s/^~[^\/]*/$homedir/; + $path; + } + + sub resolve_relative_path { + my ($class, $path) = @_; + $path = File::Spec->rel2abs($path); + } + + sub setup_local_lib_for { + my ($class, $path) = @_; + $path = $class->ensure_dir_structure_for($path); + if ($0 eq '-') { + $class->print_environment_vars_for($path); + exit 0; + } else { + $class->setup_env_hash_for($path); + @INC = _uniq(split($Config{path_sep}, $ENV{PERL5LIB}), @INC); + } + } + + sub install_base_bin_path { + my ($class, $path) = @_; + File::Spec->catdir($path, 'bin'); + } + + sub install_base_perl_path { + my ($class, $path) = @_; + File::Spec->catdir($path, 'lib', 'perl5'); + } + + sub install_base_arch_path { + my ($class, $path) = @_; + File::Spec->catdir($class->install_base_perl_path($path), $Config{archname}); + } + + sub ensure_dir_structure_for { + my ($class, $path) = @_; + unless (-d $path) { + warn "Attempting to create directory ${path}\n"; + } + File::Path::mkpath($path); + # Need to have the path exist to make a short name for it, so + # converting to a short name here. + $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32'; + + return $path; + } + + sub INTERPOLATE_ENV () { 1 } + sub LITERAL_ENV () { 0 } + + sub guess_shelltype { + my $shellbin = 'sh'; + if(defined $ENV{'SHELL'}) { + my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'}); + $shellbin = $shell_bin_path_parts[-1]; + } + my $shelltype = do { + local $_ = $shellbin; + if(/csh/) { + 'csh' + } else { + 'bourne' + } + }; + + # Both Win32 and Cygwin have $ENV{COMSPEC} set. + if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') { + my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'}); + $shellbin = $shell_bin_path_parts[-1]; + $shelltype = do { + local $_ = $shellbin; + if(/command\.com/) { + 'win32' + } elsif(/cmd\.exe/) { + 'win32' + } elsif(/4nt\.exe/) { + 'win32' + } else { + $shelltype + } + }; + } + return $shelltype; + } + + sub print_environment_vars_for { + my ($class, $path) = @_; + print $class->environment_vars_string_for($path); + } + + sub environment_vars_string_for { + my ($class, $path) = @_; + my @envs = $class->build_environment_vars_for($path, LITERAL_ENV); + my $out = ''; + + # rather basic csh detection, goes on the assumption that something won't + # call itself csh unless it really is. also, default to bourne in the + # pathological situation where a user doesn't have $ENV{SHELL} defined. + # note also that shells with funny names, like zoid, are assumed to be + # bourne. + + my $shelltype = $class->guess_shelltype; + + while (@envs) { + my ($name, $value) = (shift(@envs), shift(@envs)); + $value =~ s/(\\")/\\$1/g; + $out .= $class->${\"build_${shelltype}_env_declaration"}($name, $value); + } + return $out; + } + + # simple routines that take two arguments: an %ENV key and a value. return + # strings that are suitable for passing directly to the relevant shell to set + # said key to said value. + sub build_bourne_env_declaration { + my $class = shift; + my($name, $value) = @_; + return qq{export ${name}="${value}"\n}; + } + + sub build_csh_env_declaration { + my $class = shift; + my($name, $value) = @_; + return qq{setenv ${name} "${value}"\n}; + } + + sub build_win32_env_declaration { + my $class = shift; + my($name, $value) = @_; + return qq{set ${name}=${value}\n}; + } + + sub setup_env_hash_for { + my ($class, $path) = @_; + my %envs = $class->build_environment_vars_for($path, INTERPOLATE_ENV); + @ENV{keys %envs} = values %envs; + } + + sub build_environment_vars_for { + my ($class, $path, $interpolate) = @_; + return ( + PERL_LOCAL_LIB_ROOT => $path, + PERL_MB_OPT => "--install_base ${path}", + PERL_MM_OPT => "INSTALL_BASE=${path}", + PERL5LIB => join($Config{path_sep}, + $class->install_base_arch_path($path), + $class->install_base_perl_path($path), + (($ENV{PERL5LIB}||()) ? + ($interpolate == INTERPOLATE_ENV + ? ($ENV{PERL5LIB}) + : (($^O ne 'MSWin32') ? '$PERL5LIB' : '%PERL5LIB%' )) + : ()) + ), + PATH => join($Config{path_sep}, + $class->install_base_bin_path($path), + ($interpolate == INTERPOLATE_ENV + ? ($ENV{PATH}||()) + : (($^O ne 'MSWin32') ? '$PATH' : '%PATH%' )) + ), + ) + } + + 1; +LOCAL_LIB + +$fatpacked{"parent.pm"} = <<'PARENT'; + package parent; + use strict; + use vars qw($VERSION); + $VERSION = '0.225'; + + sub import { + my $class = shift; + + my $inheritor = caller(0); + + if ( @_ and $_[0] eq '-norequire' ) { + shift @_; + } else { + for ( my @filename = @_ ) { + if ( $_ eq $inheritor ) { + warn "Class '$inheritor' tried to inherit from itself\n"; + }; + + s{::|'}{/}g; + require "$_.pm"; # dies if the file is not found + } + } + + { + no strict 'refs'; + push @{"$inheritor\::ISA"}, @_; + }; + }; + + "All your base are belong to us" + + __END__ + +PARENT + +$fatpacked{"version.pm"} = <<'VERSION'; + #!perl -w + package version; + + use 5.005_04; + use strict; + + use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv); + + $VERSION = 0.88; + + $CLASS = 'version'; + + #--------------------------------------------------------------------------# + # Version regexp components + #--------------------------------------------------------------------------# + + # Fraction part of a decimal version number. This is a common part of + # both strict and lax decimal versions + + my $FRACTION_PART = qr/\.[0-9]+/; + + # First part of either decimal or dotted-decimal strict version number. + # Unsigned integer with no leading zeroes (except for zero itself) to + # avoid confusion with octal. + + my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/; + + # First part of either decimal or dotted-decimal lax version number. + # Unsigned integer, but allowing leading zeros. Always interpreted + # as decimal. However, some forms of the resulting syntax give odd + # results if used as ordinary Perl expressions, due to how perl treats + # octals. E.g. + # version->new("010" ) == 10 + # version->new( 010 ) == 8 + # version->new( 010.2) == 82 # "8" . "2" + + my $LAX_INTEGER_PART = qr/[0-9]+/; + + # Second and subsequent part of a strict dotted-decimal version number. + # Leading zeroes are permitted, and the number is always decimal. + # Limited to three digits to avoid overflow when converting to decimal + # form and also avoid problematic style with excessive leading zeroes. + + my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/; + + # Second and subsequent part of a lax dotted-decimal version number. + # Leading zeroes are permitted, and the number is always decimal. No + # limit on the numerical value or number of digits, so there is the + # possibility of overflow when converting to decimal form. + + my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/; + + # Alpha suffix part of lax version number syntax. Acts like a + # dotted-decimal part. + + my $LAX_ALPHA_PART = qr/_[0-9]+/; + + #--------------------------------------------------------------------------# + # Strict version regexp definitions + #--------------------------------------------------------------------------# + + # Strict decimal version number. + + my $STRICT_DECIMAL_VERSION = + qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x; + + # Strict dotted-decimal version number. Must have both leading "v" and + # at least three parts, to avoid confusion with decimal syntax. + + my $STRICT_DOTTED_DECIMAL_VERSION = + qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x; + + # Complete strict version number syntax -- should generally be used + # anchored: qr/ \A $STRICT \z /x + + $STRICT = + qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x; + + #--------------------------------------------------------------------------# + # Lax version regexp definitions + #--------------------------------------------------------------------------# + + # Lax decimal version number. Just like the strict one except for + # allowing an alpha suffix or allowing a leading or trailing + # decimal-point + + my $LAX_DECIMAL_VERSION = + qr/ $LAX_INTEGER_PART (?: \. | $FRACTION_PART $LAX_ALPHA_PART? )? + | + $FRACTION_PART $LAX_ALPHA_PART? + /x; + + # Lax dotted-decimal version number. Distinguished by having either + # leading "v" or at least three non-alpha parts. Alpha part is only + # permitted if there are at least two non-alpha parts. Strangely + # enough, without the leading "v", Perl takes .1.2 to mean v0.1.2, + # so when there is no "v", the leading part is optional + + my $LAX_DOTTED_DECIMAL_VERSION = + qr/ + v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )? + | + $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART? + /x; + + # Complete lax version number syntax -- should generally be used + # anchored: qr/ \A $LAX \z /x + # + # The string 'undef' is a special case to make for easier handling + # of return values from ExtUtils::MM->parse_version + + $LAX = + qr/ undef | $LAX_DECIMAL_VERSION | $LAX_DOTTED_DECIMAL_VERSION /x; + + #--------------------------------------------------------------------------# + + eval "use version::vxs $VERSION"; + if ( $@ ) { # don't have the XS version installed + eval "use version::vpp $VERSION"; # don't tempt fate + die "$@" if ( $@ ); + push @ISA, "version::vpp"; + local $^W; + *version::qv = \&version::vpp::qv; + *version::declare = \&version::vpp::declare; + *version::_VERSION = \&version::vpp::_VERSION; + if ($] >= 5.009000 && $] < 5.011004) { + no strict 'refs'; + *version::stringify = \&version::vpp::stringify; + *{'version::(""'} = \&version::vpp::stringify; + *version::new = \&version::vpp::new; + *version::parse = \&version::vpp::parse; + } + } + else { # use XS module + push @ISA, "version::vxs"; + local $^W; + *version::declare = \&version::vxs::declare; + *version::qv = \&version::vxs::qv; + *version::_VERSION = \&version::vxs::_VERSION; + *version::vcmp = \&version::vxs::VCMP; + if ($] >= 5.009000 && $] < 5.011004) { + no strict 'refs'; + *version::stringify = \&version::vxs::stringify; + *{'version::(""'} = \&version::vxs::stringify; + *version::new = \&version::vxs::new; + *version::parse = \&version::vxs::parse; + } + + } + + # Preloaded methods go here. + sub import { + no strict 'refs'; + my ($class) = shift; + + # Set up any derived class + unless ($class eq 'version') { + local $^W; + *{$class.'::declare'} = \&version::declare; + *{$class.'::qv'} = \&version::qv; + } + + my %args; + if (@_) { # any remaining terms are arguments + map { $args{$_} = 1 } @_ + } + else { # no parameters at all on use line + %args = + ( + qv => 1, + 'UNIVERSAL::VERSION' => 1, + ); + } + + my $callpkg = caller(); + + if (exists($args{declare})) { + *{$callpkg.'::declare'} = + sub {return $class->declare(shift) } + unless defined(&{$callpkg.'::declare'}); + } + + if (exists($args{qv})) { + *{$callpkg.'::qv'} = + sub {return $class->qv(shift) } + unless defined(&{$callpkg.'::qv'}); + } + + if (exists($args{'UNIVERSAL::VERSION'})) { + local $^W; + *UNIVERSAL::VERSION + = \&version::_VERSION; + } + + if (exists($args{'VERSION'})) { + *{$callpkg.'::VERSION'} = \&version::_VERSION; + } + + if (exists($args{'is_strict'})) { + *{$callpkg.'::is_strict'} = \&version::is_strict + unless defined(&{$callpkg.'::is_strict'}); + } + + if (exists($args{'is_lax'})) { + *{$callpkg.'::is_lax'} = \&version::is_lax + unless defined(&{$callpkg.'::is_lax'}); + } + } + + sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x } + sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x } + + 1; +VERSION + +$fatpacked{"Version/Requirements.pm"} = <<'VERSION_REQUIREMENTS'; + use strict; + use warnings; + package Version::Requirements; + BEGIN { + $Version::Requirements::VERSION = '0.101020'; + } + # ABSTRACT: a set of version requirements for a CPAN dist + + + use Carp (); + use Scalar::Util (); + use version 0.77 (); # the ->parse method + + + sub new { + my ($class) = @_; + return bless {} => $class; + } + + sub _version_object { + my ($self, $version) = @_; + + $version = (! defined $version) ? version->parse(0) + : (! Scalar::Util::blessed($version)) ? version->parse($version) + : $version; + + return $version; + } + + + BEGIN { + for my $type (qw(minimum maximum exclusion exact_version)) { + my $method = "with_$type"; + my $to_add = $type eq 'exact_version' ? $type : "add_$type"; + + my $code = sub { + my ($self, $name, $version) = @_; + + $version = $self->_version_object( $version ); + + $self->__modify_entry_for($name, $method, $version); + + return $self; + }; + + no strict 'refs'; + *$to_add = $code; + } + } + + + sub add_requirements { + my ($self, $req) = @_; + + for my $module ($req->required_modules) { + my $modifiers = $req->__entry_for($module)->as_modifiers; + for my $modifier (@$modifiers) { + my ($method, @args) = @$modifier; + $self->$method($module => @args); + }; + } + + return $self; + } + + + sub accepts_module { + my ($self, $module, $version) = @_; + + $version = $self->_version_object( $version ); + + return 1 unless my $range = $self->__entry_for($module); + return $range->_accepts($version); + } + + + sub clear_requirement { + my ($self, $module) = @_; + + return $self unless $self->__entry_for($module); + + Carp::confess("can't clear requirements on finalized requirements") + if $self->is_finalized; + + delete $self->{requirements}{ $module }; + + return $self; + } + + + sub required_modules { keys %{ $_[0]{requirements} } } + + + sub clone { + my ($self) = @_; + my $new = (ref $self)->new; + + return $new->add_requirements($self); + } + + sub __entry_for { $_[0]{requirements}{ $_[1] } } + + sub __modify_entry_for { + my ($self, $name, $method, $version) = @_; + + my $fin = $self->is_finalized; + my $old = $self->__entry_for($name); + + Carp::confess("can't add new requirements to finalized requirements") + if $fin and not $old; + + my $new = ($old || 'Version::Requirements::_Range::Range') + ->$method($version); + + Carp::confess("can't modify finalized requirements") + if $fin and $old->as_string ne $new->as_string; + + $self->{requirements}{ $name } = $new; + } + + + sub is_simple { + my ($self) = @_; + for my $module ($self->required_modules) { + # XXX: This is a complete hack, but also entirely correct. + return if $self->__entry_for($module)->as_string =~ /\s/; + } + + return 1; + } + + + sub is_finalized { $_[0]{finalized} } + + + sub finalize { $_[0]{finalized} = 1 } + + + sub as_string_hash { + my ($self) = @_; + + my %hash = map {; $_ => $self->{requirements}{$_}->as_string } + $self->required_modules; + + return \%hash; + } + + + my %methods_for_op = ( + '==' => [ qw(exact_version) ], + '!=' => [ qw(add_exclusion) ], + '>=' => [ qw(add_minimum) ], + '<=' => [ qw(add_maximum) ], + '>' => [ qw(add_minimum add_exclusion) ], + '<' => [ qw(add_maximum add_exclusion) ], + ); + + sub from_string_hash { + my ($class, $hash) = @_; + + my $self = $class->new; + + for my $module (keys %$hash) { + my @parts = split qr{\s*,\s*}, $hash->{ $module }; + for my $part (@parts) { + my ($op, $ver) = split /\s+/, $part, 2; + + if (! defined $ver) { + $self->add_minimum($module => $op); + } else { + Carp::confess("illegal requirement string: $hash->{ $module }") + unless my $methods = $methods_for_op{ $op }; + + $self->$_($module => $ver) for @$methods; + } + } + } + + return $self; + } + + ############################################################## + + { + package + Version::Requirements::_Range::Exact; + BEGIN { + $Version::Requirements::_Range::Exact::VERSION = '0.101020'; + } + sub _new { bless { version => $_[1] } => $_[0] } + + sub _accepts { return $_[0]{version} == $_[1] } + + sub as_string { return "== $_[0]{version}" } + + sub as_modifiers { return [ [ exact_version => $_[0]{version} ] ] } + + sub _clone { + (ref $_[0])->_new( version->new( $_[0]{version} ) ) + } + + sub with_exact_version { + my ($self, $version) = @_; + + return $self->_clone if $self->_accepts($version); + + Carp::confess("illegal requirements: unequal exact version specified"); + } + + sub with_minimum { + my ($self, $minimum) = @_; + return $self->_clone if $self->{version} >= $minimum; + Carp::confess("illegal requirements: minimum above exact specification"); + } + + sub with_maximum { + my ($self, $maximum) = @_; + return $self->_clone if $self->{version} <= $maximum; + Carp::confess("illegal requirements: maximum below exact specification"); + } + + sub with_exclusion { + my ($self, $exclusion) = @_; + return $self->_clone unless $exclusion == $self->{version}; + Carp::confess("illegal requirements: excluded exact specification"); + } + } + + ############################################################## + + { + package + Version::Requirements::_Range::Range; + BEGIN { + $Version::Requirements::_Range::Range::VERSION = '0.101020'; + } + + sub _self { ref($_[0]) ? $_[0] : (bless { } => $_[0]) } + + sub _clone { + return (bless { } => $_[0]) unless ref $_[0]; + + my ($s) = @_; + my %guts = ( + (exists $s->{minimum} ? (minimum => version->new($s->{minimum})) : ()), + (exists $s->{maximum} ? (maximum => version->new($s->{maximum})) : ()), + + (exists $s->{exclusions} + ? (exclusions => [ map { version->new($_) } @{ $s->{exclusions} } ]) + : ()), + ); + + bless \%guts => ref($s); + } + + sub as_modifiers { + my ($self) = @_; + my @mods; + push @mods, [ add_minimum => $self->{minimum} ] if exists $self->{minimum}; + push @mods, [ add_maximum => $self->{maximum} ] if exists $self->{maximum}; + push @mods, map {; [ add_exclusion => $_ ] } @{$self->{exclusions} || []}; + return \@mods; + } + + sub as_string { + my ($self) = @_; + + return 0 if ! keys %$self; + + return "$self->{minimum}" if (keys %$self) == 1 and exists $self->{minimum}; + + my @exclusions = @{ $self->{exclusions} || [] }; + + my @parts; + + for my $pair ( + [ qw( >= > minimum ) ], + [ qw( <= < maximum ) ], + ) { + my ($op, $e_op, $k) = @$pair; + if (exists $self->{$k}) { + my @new_exclusions = grep { $_ != $self->{ $k } } @exclusions; + if (@new_exclusions == @exclusions) { + push @parts, "$op $self->{ $k }"; + } else { + push @parts, "$e_op $self->{ $k }"; + @exclusions = @new_exclusions; + } + } + } + + push @parts, map {; "!= $_" } @exclusions; + + return join q{, }, @parts; + } + + sub with_exact_version { + my ($self, $version) = @_; + $self = $self->_clone; + + Carp::confess("illegal requirements: exact specification outside of range") + unless $self->_accepts($version); + + return Version::Requirements::_Range::Exact->_new($version); + } + + sub _simplify { + my ($self) = @_; + + if (defined $self->{minimum} and defined $self->{maximum}) { + if ($self->{minimum} == $self->{maximum}) { + Carp::confess("illegal requirements: excluded all values") + if grep { $_ == $self->{minimum} } @{ $self->{exclusions} || [] }; + + return Version::Requirements::_Range::Exact->_new($self->{minimum}) + } + + Carp::confess("illegal requirements: minimum exceeds maximum") + if $self->{minimum} > $self->{maximum}; + } + + # eliminate irrelevant exclusions + if ($self->{exclusions}) { + my %seen; + @{ $self->{exclusions} } = grep { + (! defined $self->{minimum} or $_ >= $self->{minimum}) + and + (! defined $self->{maximum} or $_ <= $self->{maximum}) + and + ! $seen{$_}++ + } @{ $self->{exclusions} }; + } + + return $self; + } + + sub with_minimum { + my ($self, $minimum) = @_; + $self = $self->_clone; + + if (defined (my $old_min = $self->{minimum})) { + $self->{minimum} = (sort { $b cmp $a } ($minimum, $old_min))[0]; + } else { + $self->{minimum} = $minimum; + } + + return $self->_simplify; + } + + sub with_maximum { + my ($self, $maximum) = @_; + $self = $self->_clone; + + if (defined (my $old_max = $self->{maximum})) { + $self->{maximum} = (sort { $a cmp $b } ($maximum, $old_max))[0]; + } else { + $self->{maximum} = $maximum; + } + + return $self->_simplify; + } + + sub with_exclusion { + my ($self, $exclusion) = @_; + $self = $self->_clone; + + push @{ $self->{exclusions} ||= [] }, $exclusion; + + return $self->_simplify; + } + + sub _accepts { + my ($self, $version) = @_; + + return if defined $self->{minimum} and $version < $self->{minimum}; + return if defined $self->{maximum} and $version > $self->{maximum}; + return if defined $self->{exclusions} + and grep { $version == $_ } @{ $self->{exclusions} }; + + return 1; + } + } + + 1; + + __END__ + =pod + +VERSION_REQUIREMENTS + +$fatpacked{"version/vpp.pm"} = <<'VERSION_VPP'; + package charstar; + # a little helper class to emulate C char* semantics in Perl + # so that prescan_version can use the same code as in C + + use overload ( + '""' => \&thischar, + '0+' => \&thischar, + '++' => \&increment, + '--' => \&decrement, + '+' => \&plus, + '-' => \&minus, + '*' => \&multiply, + 'cmp' => \&cmp, + '<=>' => \&spaceship, + 'bool' => \&thischar, + '=' => \&clone, + ); + + sub new { + my ($self, $string) = @_; + my $class = ref($self) || $self; + + my $obj = { + string => [split(//,$string)], + current => 0, + }; + return bless $obj, $class; + } + + sub thischar { + my ($self) = @_; + my $last = $#{$self->{string}}; + my $curr = $self->{current}; + if ($curr >= 0 && $curr <= $last) { + return $self->{string}->[$curr]; + } + else { + return ''; + } + } + + sub increment { + my ($self) = @_; + $self->{current}++; + } + + sub decrement { + my ($self) = @_; + $self->{current}--; + } + + sub plus { + my ($self, $offset) = @_; + my $rself = $self->clone; + $rself->{current} += $offset; + return $rself; + } + + sub minus { + my ($self, $offset) = @_; + my $rself = $self->clone; + $rself->{current} -= $offset; + return $rself; + } + + sub multiply { + my ($left, $right, $swapped) = @_; + my $char = $left->thischar(); + return $char * $right; + } + + sub spaceship { + my ($left, $right, $swapped) = @_; + unless (ref($right)) { # not an object already + $right = $left->new($right); + } + return $left->{current} <=> $right->{current}; + } + + sub cmp { + my ($left, $right, $swapped) = @_; + unless (ref($right)) { # not an object already + if (length($right) == 1) { # comparing single character only + return $left->thischar cmp $right; + } + $right = $left->new($right); + } + return $left->currstr cmp $right->currstr; + } + + sub bool { + my ($self) = @_; + my $char = $self->thischar; + return ($char ne ''); + } + + sub clone { + my ($left, $right, $swapped) = @_; + $right = { + string => [@{$left->{string}}], + current => $left->{current}, + }; + return bless $right, ref($left); + } + + sub currstr { + my ($self, $s) = @_; + my $curr = $self->{current}; + my $last = $#{$self->{string}}; + if (defined($s) && $s->{current} < $last) { + $last = $s->{current}; + } + + my $string = join('', @{$self->{string}}[$curr..$last]); + return $string; + } + + package version::vpp; + use strict; + + use POSIX qw/locale_h/; + use locale; + use vars qw ($VERSION @ISA @REGEXS); + $VERSION = 0.88; + + use overload ( + '""' => \&stringify, + '0+' => \&numify, + 'cmp' => \&vcmp, + '<=>' => \&vcmp, + 'bool' => \&vbool, + 'nomethod' => \&vnoop, + ); + + eval "use warnings"; + if ($@) { + eval ' + package warnings; + sub enabled {return $^W;} + 1; + '; + } + + my $VERSION_MAX = 0x7FFFFFFF; + + # implement prescan_version as closely to the C version as possible + use constant TRUE => 1; + use constant FALSE => 0; + + sub isDIGIT { + my ($char) = shift->thischar(); + return ($char =~ /\d/); + } + + sub isALPHA { + my ($char) = shift->thischar(); + return ($char =~ /[a-zA-Z]/); + } + + sub isSPACE { + my ($char) = shift->thischar(); + return ($char =~ /\s/); + } + + sub BADVERSION { + my ($s, $errstr, $error) = @_; + if ($errstr) { + $$errstr = $error; + } + return $s; + } + + sub prescan_version { + my ($s, $strict, $errstr, $sqv, $ssaw_decimal, $swidth, $salpha) = @_; + my $qv = defined $sqv ? $$sqv : FALSE; + my $saw_decimal = defined $ssaw_decimal ? $$ssaw_decimal : 0; + my $width = defined $swidth ? $$swidth : 3; + my $alpha = defined $salpha ? $$salpha : FALSE; + + my $d = $s; + + if ($qv && isDIGIT($d)) { + goto dotted_decimal_version; + } + + if ($d eq 'v') { # explicit v-string + $d++; + if (isDIGIT($d)) { + $qv = TRUE; + } + else { # degenerate v-string + # requires v1.2.3 + return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)"); + } + + dotted_decimal_version: + if ($strict && $d eq '0' && isDIGIT($d+1)) { + # no leading zeros allowed + return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)"); + } + + while (isDIGIT($d)) { # integer part + $d++; + } + + if ($d eq '.') + { + $saw_decimal++; + $d++; # decimal point + } + else + { + if ($strict) { + # require v1.2.3 + return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)"); + } + else { + goto version_prescan_finish; + } + } + + { + my $i = 0; + my $j = 0; + while (isDIGIT($d)) { # just keep reading + $i++; + while (isDIGIT($d)) { + $d++; $j++; + # maximum 3 digits between decimal + if ($strict && $j > 3) { + return BADVERSION($s,$errstr,"Invalid version format (maximum 3 digits between decimals)"); + } + } + if ($d eq '_') { + if ($strict) { + return BADVERSION($s,$errstr,"Invalid version format (no underscores)"); + } + if ( $alpha ) { + return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)"); + } + $d++; + $alpha = TRUE; + } + elsif ($d eq '.') { + if ($alpha) { + return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)"); + } + $saw_decimal++; + $d++; + } + elsif (!isDIGIT($d)) { + last; + } + $j = 0; + } + + if ($strict && $i < 2) { + # requires v1.2.3 + return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions require at least three parts)"); + } + } + } # end if dotted-decimal + else + { # decimal versions + # special $strict case for leading '.' or '0' + if ($strict) { + if ($d eq '.') { + return BADVERSION($s,$errstr,"Invalid version format (0 before decimal required)"); + } + if ($d eq '0' && isDIGIT($d+1)) { + return BADVERSION($s,$errstr,"Invalid version format (no leading zeros)"); + } + } + + # consume all of the integer part + while (isDIGIT($d)) { + $d++; + } + + # look for a fractional part + if ($d eq '.') { + # we found it, so consume it + $saw_decimal++; + $d++; + } + elsif (!$d || $d eq ';' || isSPACE($d) || $d eq '}') { + if ( $d == $s ) { + # found nothing + return BADVERSION($s,$errstr,"Invalid version format (version required)"); + } + # found just an integer + goto version_prescan_finish; + } + elsif ( $d == $s ) { + # didn't find either integer or period + return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)"); + } + elsif ($d eq '_') { + # underscore can't come after integer part + if ($strict) { + return BADVERSION($s,$errstr,"Invalid version format (no underscores)"); + } + elsif (isDIGIT($d+1)) { + return BADVERSION($s,$errstr,"Invalid version format (alpha without decimal)"); + } + else { + return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)"); + } + } + elsif ($d) { + # anything else after integer part is just invalid data + return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)"); + } + + # scan the fractional part after the decimal point + if ($d && !isDIGIT($d) && ($strict || ! ($d eq ';' || isSPACE($d) || $d eq '}') )) { + # $strict or lax-but-not-the-end + return BADVERSION($s,$errstr,"Invalid version format (fractional part required)"); + } + + while (isDIGIT($d)) { + $d++; + if ($d eq '.' && isDIGIT($d-1)) { + if ($alpha) { + return BADVERSION($s,$errstr,"Invalid version format (underscores before decimal)"); + } + if ($strict) { + return BADVERSION($s,$errstr,"Invalid version format (dotted-decimal versions must begin with 'v')"); + } + $d = $s; # start all over again + $qv = TRUE; + goto dotted_decimal_version; + } + if ($d eq '_') { + if ($strict) { + return BADVERSION($s,$errstr,"Invalid version format (no underscores)"); + } + if ( $alpha ) { + return BADVERSION($s,$errstr,"Invalid version format (multiple underscores)"); + } + if ( ! isDIGIT($d+1) ) { + return BADVERSION($s,$errstr,"Invalid version format (misplaced underscore)"); + } + $d++; + $alpha = TRUE; + } + } + } + + version_prescan_finish: + while (isSPACE($d)) { + $d++; + } + + if ($d && !isDIGIT($d) && (! ($d eq ';' || $d eq '}') )) { + # trailing non-numeric data + return BADVERSION($s,$errstr,"Invalid version format (non-numeric data)"); + } + + if (defined $sqv) { + $$sqv = $qv; + } + if (defined $swidth) { + $$swidth = $width; + } + if (defined $ssaw_decimal) { + $$ssaw_decimal = $saw_decimal; + } + if (defined $salpha) { + $$salpha = $alpha; + } + return $d; + } + + sub scan_version { + my ($s, $rv, $qv) = @_; + my $start; + my $pos; + my $last; + my $errstr; + my $saw_decimal = 0; + my $width = 3; + my $alpha = FALSE; + my $vinf = FALSE; + my @av; + + $s = new charstar $s; + + while (isSPACE($s)) { # leading whitespace is OK + $s++; + } + + $last = prescan_version($s, FALSE, \$errstr, \$qv, \$saw_decimal, + \$width, \$alpha); + + if ($errstr) { + # 'undef' is a special case and not an error + if ( $s ne 'undef') { + use Carp; + Carp::croak($errstr); + } + } + + $start = $s; + if ($s eq 'v') { + $s++; + } + $pos = $s; + + if ( $qv ) { + $$rv->{qv} = $qv; + } + if ( $alpha ) { + $$rv->{alpha} = $alpha; + } + if ( !$qv && $width < 3 ) { + $$rv->{width} = $width; + } + + while (isDIGIT($pos)) { + $pos++; + } + if (!isALPHA($pos)) { + my $rev; + + for (;;) { + $rev = 0; + { + # this is atoi() that delimits on underscores + my $end = $pos; + my $mult = 1; + my $orev; + + # the following if() will only be true after the decimal + # point of a version originally created with a bare + # floating point number, i.e. not quoted in any way + # + if ( !$qv && $s > $start && $saw_decimal == 1 ) { + $mult *= 100; + while ( $s < $end ) { + $orev = $rev; + $rev += $s * $mult; + $mult /= 10; + if ( (abs($orev) > abs($rev)) + || (abs($rev) > $VERSION_MAX )) { + warn("Integer overflow in version %d", + $VERSION_MAX); + $s = $end - 1; + $rev = $VERSION_MAX; + $vinf = 1; + } + $s++; + if ( $s eq '_' ) { + $s++; + } + } + } + else { + while (--$end >= $s) { + $orev = $rev; + $rev += $end * $mult; + $mult *= 10; + if ( (abs($orev) > abs($rev)) + || (abs($rev) > $VERSION_MAX )) { + warn("Integer overflow in version"); + $end = $s - 1; + $rev = $VERSION_MAX; + $vinf = 1; + } + } + } + } + + # Append revision + push @av, $rev; + if ( $vinf ) { + $s = $last; + last; + } + elsif ( $pos eq '.' ) { + $s = ++$pos; + } + elsif ( $pos eq '_' && isDIGIT($pos+1) ) { + $s = ++$pos; + } + elsif ( $pos eq ',' && isDIGIT($pos+1) ) { + $s = ++$pos; + } + elsif ( isDIGIT($pos) ) { + $s = $pos; + } + else { + $s = $pos; + last; + } + if ( $qv ) { + while ( isDIGIT($pos) ) { + $pos++; + } + } + else { + my $digits = 0; + while ( ( isDIGIT($pos) || $pos eq '_' ) && $digits < 3 ) { + if ( $pos ne '_' ) { + $digits++; + } + $pos++; + } + } + } + } + if ( $qv ) { # quoted versions always get at least three terms + my $len = $#av; + # This for loop appears to trigger a compiler bug on OS X, as it + # loops infinitely. Yes, len is negative. No, it makes no sense. + # Compiler in question is: + # gcc version 3.3 20030304 (Apple Computer, Inc. build 1640) + # for ( len = 2 - len; len > 0; len-- ) + # av_push(MUTABLE_AV(sv), newSViv(0)); + # + $len = 2 - $len; + while ($len-- > 0) { + push @av, 0; + } + } + + # need to save off the current version string for later + if ( $vinf ) { + $$rv->{original} = "v.Inf"; + $$rv->{vinf} = 1; + } + elsif ( $s > $start ) { + $$rv->{original} = $start->currstr($s); + if ( $qv && $saw_decimal == 1 && $start ne 'v' ) { + # need to insert a v to be consistent + $$rv->{original} = 'v' . $$rv->{original}; + } + } + else { + $$rv->{original} = '0'; + push(@av, 0); + } + + # And finally, store the AV in the hash + $$rv->{version} = \@av; + + # fix RT#19517 - special case 'undef' as string + if ($s eq 'undef') { + $s += 5; + } + + return $s; + } + + sub new + { + my ($class, $value) = @_; + my $self = bless ({}, ref ($class) || $class); + my $qv = FALSE; + + if ( ref($value) && eval('$value->isa("version")') ) { + # Can copy the elements directly + $self->{version} = [ @{$value->{version} } ]; + $self->{qv} = 1 if $value->{qv}; + $self->{alpha} = 1 if $value->{alpha}; + $self->{original} = ''.$value->{original}; + return $self; + } + + my $currlocale = setlocale(LC_ALL); + + # if the current locale uses commas for decimal points, we + # just replace commas with decimal places, rather than changing + # locales + if ( localeconv()->{decimal_point} eq ',' ) { + $value =~ tr/,/./; + } + + if ( not defined $value or $value =~ /^undef$/ ) { + # RT #19517 - special case for undef comparison + # or someone forgot to pass a value + push @{$self->{version}}, 0; + $self->{original} = "0"; + return ($self); + } + + if ( $#_ == 2 ) { # must be CVS-style + $value = $_[2]; + $qv = TRUE; + } + + $value = _un_vstring($value); + + # exponential notation + if ( $value =~ /\d+.?\d*e[-+]?\d+/ ) { + $value = sprintf("%.9f",$value); + $value =~ s/(0+)$//; # trim trailing zeros + } + + my $s = scan_version($value, \$self, $qv); + + if ($s) { # must be something left over + warn("Version string '%s' contains invalid data; " + ."ignoring: '%s'", $value, $s); + } + + return ($self); + } + + *parse = \&new; + + sub numify + { + my ($self) = @_; + unless (_verify($self)) { + require Carp; + Carp::croak("Invalid version object"); + } + my $width = $self->{width} || 3; + my $alpha = $self->{alpha} || ""; + my $len = $#{$self->{version}}; + my $digit = $self->{version}[0]; + my $string = sprintf("%d.", $digit ); + + for ( my $i = 1 ; $i < $len ; $i++ ) { + $digit = $self->{version}[$i]; + if ( $width < 3 ) { + my $denom = 10**(3-$width); + my $quot = int($digit/$denom); + my $rem = $digit - ($quot * $denom); + $string .= sprintf("%0".$width."d_%d", $quot, $rem); + } + else { + $string .= sprintf("%03d", $digit); + } + } + + if ( $len > 0 ) { + $digit = $self->{version}[$len]; + if ( $alpha && $width == 3 ) { + $string .= "_"; + } + $string .= sprintf("%0".$width."d", $digit); + } + else # $len = 0 + { + $string .= sprintf("000"); + } + + return $string; + } + + sub normal + { + my ($self) = @_; + unless (_verify($self)) { + require Carp; + Carp::croak("Invalid version object"); + } + my $alpha = $self->{alpha} || ""; + my $len = $#{$self->{version}}; + my $digit = $self->{version}[0]; + my $string = sprintf("v%d", $digit ); + + for ( my $i = 1 ; $i < $len ; $i++ ) { + $digit = $self->{version}[$i]; + $string .= sprintf(".%d", $digit); + } + + if ( $len > 0 ) { + $digit = $self->{version}[$len]; + if ( $alpha ) { + $string .= sprintf("_%0d", $digit); + } + else { + $string .= sprintf(".%0d", $digit); + } + } + + if ( $len <= 2 ) { + for ( $len = 2 - $len; $len != 0; $len-- ) { + $string .= sprintf(".%0d", 0); + } + } + + return $string; + } + + sub stringify + { + my ($self) = @_; + unless (_verify($self)) { + require Carp; + Carp::croak("Invalid version object"); + } + return exists $self->{original} + ? $self->{original} + : exists $self->{qv} + ? $self->normal + : $self->numify; + } + + sub vcmp + { + require UNIVERSAL; + my ($left,$right,$swap) = @_; + my $class = ref($left); + unless ( UNIVERSAL::isa($right, $class) ) { + $right = $class->new($right); + } + + if ( $swap ) { + ($left, $right) = ($right, $left); + } + unless (_verify($left)) { + require Carp; + Carp::croak("Invalid version object"); + } + unless (_verify($right)) { + require Carp; + Carp::croak("Invalid version object"); + } + my $l = $#{$left->{version}}; + my $r = $#{$right->{version}}; + my $m = $l < $r ? $l : $r; + my $lalpha = $left->is_alpha; + my $ralpha = $right->is_alpha; + my $retval = 0; + my $i = 0; + while ( $i <= $m && $retval == 0 ) { + $retval = $left->{version}[$i] <=> $right->{version}[$i]; + $i++; + } + + # tiebreaker for alpha with identical terms + if ( $retval == 0 + && $l == $r + && $left->{version}[$m] == $right->{version}[$m] + && ( $lalpha || $ralpha ) ) { + + if ( $lalpha && !$ralpha ) { + $retval = -1; + } + elsif ( $ralpha && !$lalpha) { + $retval = +1; + } + } + + # possible match except for trailing 0's + if ( $retval == 0 && $l != $r ) { + if ( $l < $r ) { + while ( $i <= $r && $retval == 0 ) { + if ( $right->{version}[$i] != 0 ) { + $retval = -1; # not a match after all + } + $i++; + } + } + else { + while ( $i <= $l && $retval == 0 ) { + if ( $left->{version}[$i] != 0 ) { + $retval = +1; # not a match after all + } + $i++; + } + } + } + + return $retval; + } + + sub vbool { + my ($self) = @_; + return vcmp($self,$self->new("0"),1); + } + + sub vnoop { + require Carp; + Carp::croak("operation not supported with version object"); + } + + sub is_alpha { + my ($self) = @_; + return (exists $self->{alpha}); + } + + sub qv { + my $value = shift; + my $class = 'version'; + if (@_) { + $class = ref($value) || $value; + $value = shift; + } + + $value = _un_vstring($value); + $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/; + my $version = $class->new($value); + return $version; + } + + *declare = \&qv; + + sub is_qv { + my ($self) = @_; + return (exists $self->{qv}); + } + + + sub _verify { + my ($self) = @_; + if ( ref($self) + && eval { exists $self->{version} } + && ref($self->{version}) eq 'ARRAY' + ) { + return 1; + } + else { + return 0; + } + } + + sub _is_non_alphanumeric { + my $s = shift; + $s = new charstar $s; + while ($s) { + return 0 if isSPACE($s); # early out + return 1 unless (isALPHA($s) || isDIGIT($s) || $s =~ /[.-]/); + $s++; + } + return 0; + } + + sub _un_vstring { + my $value = shift; + # may be a v-string + if ( length($value) >= 3 && $value !~ /[._]/ + && _is_non_alphanumeric($value)) { + my $tvalue; + if ( $] ge 5.008_001 ) { + $tvalue = _find_magic_vstring($value); + $value = $tvalue if length $tvalue; + } + elsif ( $] ge 5.006_000 ) { + $tvalue = sprintf("v%vd",$value); + if ( $tvalue =~ /^v\d+(\.\d+){2,}$/ ) { + # must be a v-string + $value = $tvalue; + } + } + } + return $value; + } + + sub _find_magic_vstring { + my $value = shift; + my $tvalue = ''; + require B; + my $sv = B::svref_2object(\$value); + my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef; + while ( $magic ) { + if ( $magic->TYPE eq 'V' ) { + $tvalue = $magic->PTR; + $tvalue =~ s/^v?(.+)$/v$1/; + last; + } + else { + $magic = $magic->MOREMAGIC; + } + } + return $tvalue; + } + + sub _VERSION { + my ($obj, $req) = @_; + my $class = ref($obj) || $obj; + + no strict 'refs'; + if ( exists $INC{"$class.pm"} and not %{"$class\::"} and $] >= 5.008) { + # file but no package + require Carp; + Carp::croak( "$class defines neither package nor VERSION" + ."--version check failed"); + } + + my $version = eval "\$$class\::VERSION"; + if ( defined $version ) { + local $^W if $] <= 5.008; + $version = version::vpp->new($version); + } + + if ( defined $req ) { + unless ( defined $version ) { + require Carp; + my $msg = $] < 5.006 + ? "$class version $req required--this is only version " + : "$class does not define \$$class\::VERSION" + ."--version check failed"; + + if ( $ENV{VERSION_DEBUG} ) { + Carp::confess($msg); + } + else { + Carp::croak($msg); + } + } + + $req = version::vpp->new($req); + + if ( $req > $version ) { + require Carp; + if ( $req->is_qv ) { + Carp::croak( + sprintf ("%s version %s required--". + "this is only version %s", $class, + $req->normal, $version->normal) + ); + } + else { + Carp::croak( + sprintf ("%s version %s required--". + "this is only version %s", $class, + $req->stringify, $version->stringify) + ); + } + } + } + + return defined $version ? $version->stringify : undef; + } + + 1; #this line is important and will help the module return a true value +VERSION_VPP + +s/^ //mg for values %fatpacked; + +unshift @INC, sub { + if (my $fat = $fatpacked{$_[1]}) { + open my $fh, '<', \$fat + or die "FatPacker error loading $_[1] (could be a perl installation issue?)"; + return $fh; + } + return +}; + +} # END OF FATPACK CODE + +use strict; +use App::cpanminus::script; + +unless (caller) { + my $app = App::cpanminus::script->new; + $app->parse_options(@ARGV); + $app->doit or exit(1); +} + +__END__ + +=head1 NAME + +cpanm - get, unpack build and install modules from CPAN + +=head1 SYNOPSIS + + cpanm Test::More # install Test::More + cpanm MIYAGAWA/Plack-0.99_05.tar.gz # full distribution path + cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz # install from URL + cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz # install from a local file + cpanm --interactive Task::Kensho # Configure interactively + cpanm . # install from local directory + cpanm --installdeps . # install all the deps for the current directory + cpanm -L extlib Plack # install Plack and all non-core deps into extlib + cpanm --mirror http://cpan.cpantesters.org/ DBI # use the fast-syncing mirror + cpanm --scandeps Moose # See what modules will be installed for Moose + +=head1 COMMANDS + +=over 4 + +=item -i, --install + +Installs the modules. This is a default behavior and this is just a +compatibility option to make it work like L<cpan> or L<cpanp>. + +=item --self-upgrade + +Upgrades itself. It's just an alias for: + + cpanm App::cpanminus + +=item --info + +Displays the distribution information in +C<AUTHOR/Dist-Name-ver.tar.gz> format in the standard out. + +=item --installdeps + +Installs the dependencies of the target distribution but won't build +itself. Handy if you want to try the application from a version +controlled repository such as git. + + cpanm --installdeps . + +=item --look + +Download and unpack the distribution and then open the directory with +your shell. Handy to poke around the source code or do manual +testing. + +=item -h, --help + +Displays the help message. + +=item -V, --version + +Displays the version number. + +=back + +=head1 OPTIONS + +You can specify the default options in C<PERL_CPANM_OPT> environment variable. + +=over 4 + +=item -f, --force + +Force install modules even when testing failed. + +=item -n, --notest + +Skip the testing of modules. Use this only when you just want to save +time for installing hundreds of distributions to the same perl and +architecture you've already tested to make sure it builds fine. + +Defaults to false, and you can say C<--no-notest> to override when it +is set in the default options in C<PERL_CPANM_OPT>. + +=item -S, --sudo + +Switch to the root user with C<sudo> when installing modules. Use this +if you want to install modules to the system perl include path. + +Defaults to false, and you can say C<--no-sudo> to override when it is +set in the default options in C<PERL_CPANM_OPT>. + +=item -v, --verbose + +Makes the output verbose. It also enables the interactive +configuration. (See --interactive) + +=item -q, --quiet + +Makes the output even more quiet than the default. It doesn't print +anything to the STDERR. + +=item -l, --local-lib + +Sets the L<local::lib> compatible path to install modules to. You +don't need to set this if you already configure the shell environment +variables using L<local::lib>, but this can be used to override that +as well. + +=item -L, --local-lib-contained + +Same with C<--local-lib> but when examining the dependencies, it +assumes no non-core modules are installed on the system. It's handy if +you want to bundle application dependencies in one directory so you +can distribute to other machines. + +For instance, + + cpanm -L extlib Plack + +would install Plack and all of its non-core dependencies into the +directory C<extlib>, which can be loaded from your application with: + + use local::lib '/path/to/extlib'; + +=item --mirror + +Specifies the base URL for the CPAN mirror to use, such as +C<http://cpan.cpantesters.org/> (you can omit the trailing slash). You +can specify multiple mirror URLs by repeating the command line option. + +Defaults to C<http://search.cpan.org/CPAN> which is a geo location +aware redirector. + +=item --mirror-only + +Download the mirror's 02packages.details.txt.gz index file instead of +querying the CPAN Meta DB. + +Select this option if you are using a local mirror of CPAN, such as +minicpan when you're offline, or your own CPAN index (a.k.a darkpan). + +B<Tip:> It might be useful if you name these mirror options with your +shell aliases, like: + + alias minicpanm='cpanm --mirror ~/minicpan --mirror-only' + alias darkpan='cpanm --mirror http://mycompany.example.com/DPAN --mirror-only' + +=item --mirror-index + +B<EXPERIMENTAL>: Specifies the file path to C<02packages.details.txt> +for module search index. + +=item --metacpan + +B<EXPERIMENTAL>: Use L<http://api.metacpan.org/> API for module lookup instead of +L<http://cpanmetadb.plackperl.org/>. + +=item --prompt + +Prompts when a test fails so that you can skip, force install, retry +or look in the shell to see what's going wrong. It also prompts when +one of the dependency failed if you want to proceed the installation. + +Defaults to false, and you can say C<--no-prompt> to override if it's +set in the default options in C<PERL_CPANM_OPT>. + +=item --reinstall + +cpanm, when given a module name in the command line (i.e. C<cpanm +Plack>), checks the locally installed version first and skips if it is +already installed. This option makes it skip the check, so: + + cpanm --reinstall Plack + +would reinstall L<Plack> even if your locally installed version is +latest, or even newer (which would happen if you install a developer +release from version control repositories). + +Defaults to false. + +=item --interactive + +Makes the configuration (such as C<Makefile.PL> and C<Build.PL>) +interactive, so you can answer questions in the distribution that +requires custom configuration or Task:: distributions. + +Defaults to false, and you can say C<--no-interactive> to override +when it's set in the default options in C<PERL_CPANM_OPT>. + +=item --scandeps + +Scans the depencencies of given modules and output the tree in a text +format. (See C<--format> below for more options) + +Because this command doesn't actually install any distributions, it +will be useful that by typing: + + cpanm --scandeps Catalyst::Runtime + +you can make sure what modules will be installed. + +This command takes into account which modules you already have +installed in your system. If you want to see what modules will be +installed against a vanilla perl installation, you might want to +combine it with C<-L> option. + +=item --format + +Determines what format to display the scanned dependency +tree. Available options are C<tree>, C<json>, C<yaml> and C<dists>. + +=over 8 + +=item tree + +Displays the tree in a plain text format. This is the default value. + +=item json, yaml + +Outputs the tree in a JSON or YAML format. L<JSON> and L<YAML> modules +need to be installed respectively. The output tree is represented as a +recursive tuple of: + + [ distribution, dependencies ] + +and the container is an array containing the root elements. Note that +there may be multiple root nodes, since you can give multiple modules +to the C<--scandeps> command. + +=item dists + +C<dists> is a special output format, where it prints the distribution +filename in the I<depth first order> after the dependency resolution, +like: + + GAAS/MIME-Base64-3.13.tar.gz + GAAS/URI-1.58.tar.gz + PETDANCE/HTML-Tagset-3.20.tar.gz + GAAS/HTML-Parser-3.68.tar.gz + GAAS/libwww-perl-5.837.tar.gz + +which means you can install these distributions in this order without +extra dependencies. When combined with C<-L> option, it will be useful +to replay installations on other machines. + +=back + +=item --save-dists + +Specifies the optional directory path to copy downloaded tarballs in +the CPAN mirror compatible directory structure +i.e. I<authors/id/A/AU/AUTHORS/Foo-Bar-version.tar.gz> + +=item --uninst-shadows + +Uninstalls the shadow files of the distribution that you're +installing. This eliminates the confusion if you're trying to install +core (dual-life) modules from CPAN against perl 5.10 or older, or +modules that used to be XS-based but switched to pure perl at some +version. + +If you run cpanm as root and use C<INSTALL_BASE> or equivalent to +specify custom installation path, you SHOULD disable this option so +you won't accidentally uninstall dual-life modules from the core +include path. + +Defaults to true if your perl version is smaller than 5.12, and you +can disable that with C<--no-uninst-shadows>. + +B<NOTE>: Since version 1.3000 this flag is turned off by default for +perl newer than 5.12, since with 5.12 @INC contains site_perl directory +I<before> the perl core library path, and uninstalling shadows is not +necessary anymore and does more harm by deleting files from the core +library path. + +=item --cascade-search + +B<EXPERIMENTAL>: Specifies whether to cascade search when you specify +multiple mirrors and a mirror has a lower version of the module than +requested. Defaults to false. + +=item --skip-installed + +Specifies whether a module given in the command line is skipped if its latest +version is already installed. Defaults to true. + +B<NOTE>: The C<PERL5LIB> environment variable have to be correctly set for this +to work with modules installed using L<local::lib>. + +=item --skip-satisfied + +B<EXPERIMENTAL>: Specifies whether a module (and version) given in the +command line is skipped if it's already installed. + +If you run: + + cpanm --skip-satisfied CGI DBI~1.2 + +cpanm won't install them if you already have CGI (for whatever +versions) or have DBI with version higher than 1.2. It is similar to +C<--skip-installed> but while C<--skip-installed> checks if the +I<latest> version of CPAN is installed, C<--skip-satisfied> checks if +a requested version (or not, which means any version) is installed. + +Defaults to false for bare module names, but if you specify versions +with C<~>, it will always skip satisfied requirements. + +=item --auto-cleanup + +Specifies the number of days in which cpanm's work directories +expire. Defaults to 7, which means old work directories will be +cleaned up in one week. + +You can set the value to C<0> to make cpan never cleanup those +directories. + +=item --man-pages + +Generates man pages for executables (man1) and libraries (man3). + +Defaults to false (no man pages generated) if +C<-L|--local-lib-contained> option is supplied. Otherwise, defaults to +true, and you can disable it with C<--no-man-pages>. + +=item --lwp + +Uses L<LWP> module to download stuff over HTTP. Defaults to true, and +you can say C<--no-lwp> to disable using LWP, when you want to upgrade +LWP from CPAN on some broken perl systems. + +=item --wget + +Uses GNU Wget (if available) to download stuff. Defaults to true, and +you can say C<--no-wget> to disable using Wget (versions of Wget older +than 1.9 don't support the C<--retry-connrefused> option used by cpanm). + +=item --curl + +Uses cURL (if available) to download stuff. Defaults to true, and +you can say C<--no-curl> to disable using cURL. + +Normally with C<--lwp>, C<--wget> and C<--curl> options set to true +(which is the default) cpanm tries L<LWP>, Wget, cURL and L<HTTP::Tiny> +(in that order) and uses the first one available. + +=back + +=head1 SEE ALSO + +L<App::cpanminus> + +=head1 COPYRIGHT + +Copyright 2010 Tatsuhiko Miyagawa. + +=head1 AUTHOR + +Tatsuhiko Miyagawa + +=cut diff --git a/bin/install_perl_modules b/bin/install_perl_modules new file mode 100755 index 000000000..0563baf96 --- /dev/null +++ b/bin/install_perl_modules @@ -0,0 +1,23 @@ +#!/bin/bash + +DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd | sed -e 's/\/bin$//' )" + +$DIR/bin/cpanm -l local Carton + +export PATH=$DIR/local/bin:$PATH +export PERL5LIB=$DIR/local/lib/perl5 + +carton install --deployment + +perl -MImage::Magick -e 'exit()' >/dev/null 2>&1 + +HAVE_IM=$? + +if [ $HAVE_IM -ne 0 ] +then + read -p "Image::Magick is not installed. Do you want to attempt to install it?" yn + case $yn in + [Yy]* ) ./local/bin/carton install Image::Magick;; + * ) echo 'You will need to install it for FixMyStreet to work';; + esac +fi diff --git a/bin/make_css b/bin/make_css index 59acdb984..96c768acc 100755 --- a/bin/make_css +++ b/bin/make_css @@ -2,8 +2,8 @@ # # make_css: # Generate CSS files from SCSS files. -# Curerntly the CSS files are also in version control, though I guess -# in future they don't need to be, and compressed style could then be used. +# +# Requires sass which you can get from http://sass-lang.com/ # # Copyright (c) 2011 UK Citizens Online Democracy. All rights reserved. # Email: matthew@mysociety.org. WWW: http://www.mysociety.org diff --git a/bin/send-alerts b/bin/send-alerts index 4464b16e9..00c5426bc 100755 --- a/bin/send-alerts +++ b/bin/send-alerts @@ -1,4 +1,4 @@ -#!/usr/bin/env perl -w +#!/usr/bin/env perl # send-alerts: # Email alerts for FixMyStreet @@ -7,6 +7,7 @@ # Email: matthew@mysociety.org. WWW: http://www.mysociety.org use strict; +use warnings; require 5.8.0; use CGI; # XXX diff --git a/bin/send-questionnaires b/bin/send-questionnaires index 4910abc02..7ed3c87c2 100755 --- a/bin/send-questionnaires +++ b/bin/send-questionnaires @@ -1,4 +1,4 @@ -#!/usr/bin/env perl -w +#!/usr/bin/env perl # send-questionnaires: # Send out creator questionnaires @@ -7,6 +7,7 @@ # Email: matthew@mysociety.org. WWW: http://www.mysociety.org use strict; +use warnings; require 5.8.0; use CGI; # XXX Awkward kludge diff --git a/bin/send-reports b/bin/send-reports index e012cc1f0..22bd12732 100755 --- a/bin/send-reports +++ b/bin/send-reports @@ -1,4 +1,4 @@ -#!/usr/bin/env perl -w +#!/usr/bin/env perl # send-reports: # Send new problem reports to councils @@ -7,6 +7,7 @@ # Email: matthew@mysociety.org. WWW: http://www.mysociety.org use strict; +use warnings; require 5.8.0; use Digest::MD5; diff --git a/bin/update-all-reports b/bin/update-all-reports index c87977f68..4c4838c77 100755 --- a/bin/update-all-reports +++ b/bin/update-all-reports @@ -20,7 +20,7 @@ my $fourweeks = 4*7*24*60*60; my $problems = FixMyStreet::App->model("DB::Problem")->search( { - state => [ 'confirmed', 'fixed' ] + state => [ FixMyStreet::DB::Result::Problem->visible_states() ], }, { columns => [ @@ -52,10 +52,13 @@ while ( my @problem = $problems->next ) { my $type = ( $problem{duration} > 2 * $fourweeks ) ? 'unknown' : ($problem{age} > $fourweeks ? 'older' : 'new'); - # Fixed problems are either old or new - $fixed{$council}{$duration_str}++ if $problem{state} eq 'fixed'; - # Open problems are either unknown, older, or new - $open{$council}{$type}++ if $problem{state} eq 'confirmed'; + if (FixMyStreet::DB::Result::Problem->fixed_states()->{$problem{state}}) { + # Fixed problems are either old or new + $fixed{$council}{$duration_str}++ if FixMyStreet::DB::Result::Problem->fixed_states()->{$problem{state}}; + } else { + # Open problems are either unknown, older, or new + $open{$council}{$type}++ if $problem{state} eq 'confirmed'; + } } } diff --git a/blog/conf/general-example b/blog/conf/general-example new file mode 100644 index 000000000..dca1e9dcc --- /dev/null +++ b/blog/conf/general-example @@ -0,0 +1,27 @@ +<?php +/* + * general-example: + * Example values for the "general" config file. + * + * Configuration parameters, in PHP syntax. Configuration parameters are set + * using the PHP define('OPTION_...', '...') function. Both perl and PHP code + * parse this properly, so you can use comments and conditionals and whatnot, + * but unless essential it's better to keep it simple.... + * + * Copy this file to one called "general" in the same directory. Or + * have multiple config files and use a symlink to change between them. + * + * Copyright (c) 2005 UK Citizens Online Democracy. All rights reserved. + * Email: francis@mysociety.org; WWW: http://www.mysociety.org + * + * $Id: general-example,v 1.2 2010-01-28 00:47:37 francis Exp $ + * + */ + +// MySQL database for FMSBLOG mySociety WordPress +define('OPTION_FMSBLOG_DB_NAME', ''); +define('OPTION_FMSBLOG_DB_USER', ''); +define('OPTION_FMSBLOG_DB_PASS', ''); +define('OPTION_FMSBLOG_DB_HOST', ''); +define('OPTION_STAGING', '0'); + diff --git a/blog/conf/httpd.conf b/blog/conf/httpd.conf new file mode 100644 index 000000000..2f93bc3cc --- /dev/null +++ b/blog/conf/httpd.conf @@ -0,0 +1,18 @@ +# Apache configuration for code.fixmystreet.com. +# +# Copyright (c) 2012 UK Citizens Online Democracy. All rights reserved. +# Email: struan@mysociety.org; WWW: http://www.mysociety.org + +<Location /fcgi> + Options +ExecCGI + SetHandler fastcgi-script +</Location> + +RewriteEngine on +#RewriteLog /var/log/apache2/rewrite.log +#RewriteLogLevel 5 + +# PHP files can be referred without PHP +RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f +RewriteRule /(.+) /$1.php [PT] + diff --git a/blog/conf/wp-config.php b/blog/conf/wp-config.php new file mode 100644 index 000000000..38599b326 --- /dev/null +++ b/blog/conf/wp-config.php @@ -0,0 +1,46 @@ +<?php +/** WordPress's config file **/ +/** http://wordpress.org/ **/ + +// ** MySQL settings ** // +if (!@include "../conf/general") { + if (!@include "../../conf/general") { + if (!@include "../../../conf/general") { + if (!@include(dirname(__FILE__) . "../../../conf/general")) { + print "Error including conf/general in wp-config.php on code.fixmystreet.com WordPress"; + exit; + } + } + } +} +define('DB_NAME', OPTION_FMSBLOG_DB_NAME); // The name of the database +define('DB_USER', OPTION_FMSBLOG_DB_USER); // Your MySQL username +define('DB_PASSWORD', OPTION_FMSBLOG_DB_PASS); // ...and password +define('DB_HOST', OPTION_FMSBLOG_DB_HOST); // 99% chance you won't need to change this value + +// Change the prefix if you want to have multiple blogs in a single database. + +$table_prefix = 'wp_'; // example: 'wp_' or 'b2' or 'mylogin_' + +// Change this to localize WordPress. A corresponding MO file for the +// chosen language must be installed to wp-includes/languages. +// For example, install de.mo to wp-includes/languages and set WPLANG to 'de' +// to enable German language support. +define ('WPLANG', ''); + +$toppath = $_SERVER['DOCUMENT_ROOT']; +$trimmed = rtrim($toppath, "blog/web"); +define('TOP_PATH', $trimmed); + +/* Stop editing */ + +$server = DB_HOST; +$loginsql = DB_USER; +$passsql = DB_PASSWORD; +$base = DB_NAME; + +define('ABSPATH', dirname(__FILE__).'/'); + +// Get everything else +require_once(ABSPATH.'wp-settings.php'); +?> diff --git a/blog/web/.htaccess b/blog/web/.htaccess new file mode 100644 index 000000000..8d2ba9aa2 --- /dev/null +++ b/blog/web/.htaccess @@ -0,0 +1,11 @@ + +# BEGIN WordPress +<IfModule mod_rewrite.c> +RewriteEngine On +RewriteBase / +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule . /index.php [L] +</IfModule> + +# END WordPress diff --git a/blog/web/fcgi/php-basic b/blog/web/fcgi/php-basic new file mode 100755 index 000000000..f3034d9e2 --- /dev/null +++ b/blog/web/fcgi/php-basic @@ -0,0 +1,3 @@ +#!/bin/sh +PHP_FCGI_CHILDREN=1 PHPRC=/etc/php5/fcgi exec /usr/bin/php5-cgi + diff --git a/blog/web/index.php b/blog/web/index.php new file mode 100644 index 000000000..fbc0ef37f --- /dev/null +++ b/blog/web/index.php @@ -0,0 +1,6 @@ +<?php + +# Copy of the lines from WP main index.php, so it can be in subdirectory +define('WP_USE_THEMES', true); +require('./wp/wp-blog-header.php'); + diff --git a/carton.lock b/carton.lock new file mode 100644 index 000000000..bbee10724 --- /dev/null +++ b/carton.lock @@ -0,0 +1,25378 @@ +{ + "modules" : { + "App::cpanminus" : { + "dist" : "App-cpanminus-1.5006", + "module" : "App::cpanminus", + "mymeta" : { + "abstract" : "Get, unpack, build and install modules from CPAN.", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112621, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "App-cpanminus", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "ExtUtils::Install" : "1.46", + "ExtUtils::MakeMaker" : "6.31", + "Module::Build" : "0.36" + } + } + }, + "release_status" : "stable", + "version" : "1.5006" + }, + "name" : "App::cpanminus", + "pathname" : "M/MI/MIYAGAWA/App-cpanminus-1.5006.tar.gz", + "provides" : { + "App::cpanminus" : { + "file" : "App/cpanminus.pm", + "version" : "1.5006" + } + }, + "version" : "1.5006" + }, + "AppConfig" : { + "dist" : "AppConfig-1.66", + "module" : "AppConfig", + "mymeta" : { + "abstract" : "AppConfig is a bundle of Perl5 modules for reading configuration files and parsing command line arguments.", + "author" : [ + "Andy Wardley <abw@wardley.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.31, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "AppConfig", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.66" + }, + "name" : "AppConfig", + "pathname" : "/authors/id/A/AB/ABW/AppConfig-1.66.tar.gz", + "provides" : { + "AppConfig" : { + "file" : "AppConfig.pm", + "version" : "1.66" + }, + "AppConfig::Args" : { + "file" : "AppConfig/Args.pm", + "version" : "1.65" + }, + "AppConfig::CGI" : { + "file" : "AppConfig/CGI.pm", + "version" : "1.65" + }, + "AppConfig::File" : { + "file" : "AppConfig/File.pm", + "version" : "1.65" + }, + "AppConfig::Getopt" : { + "file" : "AppConfig/Getopt.pm", + "version" : "1.65" + }, + "AppConfig::State" : { + "file" : "AppConfig/State.pm", + "version" : "1.65" + }, + "AppConfig::Sys" : { + "file" : "AppConfig/Sys.pm", + "version" : "1.65" + } + }, + "version" : "1.66" + }, + "Archive::Zip" : { + "dist" : "Archive-Zip-1.30", + "module" : "Archive::Zip", + "mymeta" : { + "abstract" : "Provide an interface to ZIP archive files.", + "author" : [ + "Ned Konz <perl@bike-nomad.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Archive-Zip", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Compress::Raw::Zlib" : "2.017", + "File::Basename" : 0, + "File::Copy" : 0, + "File::Find" : 0, + "File::Path" : 0, + "File::Spec" : "0.80", + "File::Temp" : 0, + "IO::File" : 0, + "IO::Handle" : 0, + "IO::Seekable" : 0, + "Test::More" : "0.42", + "Time::Local" : 0, + "perl" : "5.00396" + } + } + }, + "release_status" : "stable", + "version" : "1.30" + }, + "name" : "Archive::Zip", + "pathname" : "/authors/id/A/AD/ADAMK/Archive-Zip-1.30.tar.gz", + "provides" : { + "Archive::Zip" : { + "file" : "Archive/Zip.pm", + "version" : "1.30" + }, + "Archive::Zip::Archive" : { + "file" : "Archive/Zip/Archive.pm", + "version" : "1.30" + }, + "Archive::Zip::BufferedFileHandle" : { + "file" : "Archive/Zip/BufferedFileHandle.pm", + "version" : "1.30" + }, + "Archive::Zip::DirectoryMember" : { + "file" : "Archive/Zip/DirectoryMember.pm", + "version" : "1.30" + }, + "Archive::Zip::FileMember" : { + "file" : "Archive/Zip/FileMember.pm", + "version" : "1.30" + }, + "Archive::Zip::Member" : { + "file" : "Archive/Zip/Member.pm", + "version" : "1.30" + }, + "Archive::Zip::MemberRead" : { + "file" : "Archive/Zip/MemberRead.pm", + "version" : "1.30" + }, + "Archive::Zip::MockFileHandle" : { + "file" : "Archive/Zip/MockFileHandle.pm", + "version" : "1.30" + }, + "Archive::Zip::NewFileMember" : { + "file" : "Archive/Zip/NewFileMember.pm", + "version" : "1.30" + }, + "Archive::Zip::StringMember" : { + "file" : "Archive/Zip/StringMember.pm", + "version" : "1.30" + }, + "Archive::Zip::Tree" : { + "file" : "Archive/Zip/Tree.pm", + "version" : "1.30" + }, + "Archive::Zip::ZipFileMember" : { + "file" : "Archive/Zip/ZipFileMember.pm", + "version" : "1.30" + } + }, + "version" : "1.30" + }, + "B::Hooks::EndOfScope" : { + "dist" : "B-Hooks-EndOfScope-0.09", + "module" : "B::Hooks::EndOfScope", + "mymeta" : { + "abstract" : "Execute code after a scope finished compilation", + "author" : [ + "Florian Ragwitz <rafl@debian.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 2.101241, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "B-Hooks-EndOfScope", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "recommends" : {}, + "requires" : { + "Sub::Exporter" : 0, + "Variable::Magic" : "0.34" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=B-Hooks-EndOfScope" + }, + "homepage" : "http://search.cpan.org/dist/B-Hooks-EndOfScope", + "repository" : { + "type" : "git", + "url" : "git://github.com/rafl/b-hooks-endofscope.git" + } + }, + "version" : "0.09", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@FLORA/@Filter/GatherDir", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@FLORA/@Filter/PruneCruft", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@FLORA/@Filter/ManifestSkip", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@FLORA/@Filter/MetaYAML", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@FLORA/@Filter/License", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@FLORA/@Filter/Readme", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@FLORA/@Filter/PkgVersion", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@FLORA/@Filter/PodCoverageTests", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@FLORA/@Filter/PodSyntaxTests", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@FLORA/@Filter/ExtraTests", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@FLORA/@Filter/ExecDir", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@FLORA/@Filter/ShareDir", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@FLORA/@Filter/MakeMaker", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@FLORA/@Filter/Manifest", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@FLORA/@Filter/ConfirmRelease", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@FLORA/@Filter/UploadToCPAN", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@FLORA/MetaConfig", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@FLORA/MetaJSON", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@FLORA/MetaResources", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@FLORA/Authority", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@FLORA/PodWeaver", + "version" : "3.100710" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereq", + "name" : "@FLORA/AutoPrereq", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "2.101241" + } + ], + "zilla" : { + "class" : "Dist::Zilla", + "config" : { + "is_trial" : 0 + }, + "version" : "2.101241" + } + }, + "x_authority" : "cpan:FLORA" + }, + "name" : "B::Hooks::EndOfScope", + "pathname" : "F/FL/FLORA/B-Hooks-EndOfScope-0.09.tar.gz", + "provides" : { + "B::Hooks::EndOfScope" : { + "file" : "B/Hooks/EndOfScope.pm", + "version" : "0.09" + } + }, + "version" : "0.09" + }, + "CGI::Simple" : { + "dist" : "CGI-Simple-1.113", + "module" : "CGI::Simple::Cookie", + "mymeta" : { + "abstract" : "A Simple totally OO CGI interface that is CGI.pm compliant", + "author" : [ + "Andy Armstrong <andy@hexten.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "CGI-Simple", + "prereqs" : { + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "IO::Scalar" : 0, + "Test::More" : 0 + } + } + }, + "provides" : { + "CGI::Simple" : { + "file" : "lib/CGI/Simple.pm", + "version" : "1.113" + }, + "CGI::Simple::Cookie" : { + "file" : "lib/CGI/Simple/Cookie.pm", + "version" : "1.113" + }, + "CGI::Simple::Standard" : { + "file" : "lib/CGI/Simple/Standard.pm", + "version" : "1.113" + }, + "CGI::Simple::Util" : { + "file" : "lib/CGI/Simple/Util.pm", + "version" : "1.113" + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=CGI-Simple" + }, + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/AndyA/CGI--Simple.git (fetch)" + } + }, + "version" : "1.113" + }, + "name" : "CGI::Simple", + "pathname" : "/authors/id/A/AN/ANDYA/CGI-Simple-1.113.tar.gz", + "provides" : { + "CGI::Simple" : { + "file" : "CGI/Simple.pm", + "version" : "1.113" + }, + "CGI::Simple::Cookie" : { + "file" : "CGI/Simple/Cookie.pm", + "version" : "1.113" + }, + "CGI::Simple::Standard" : { + "file" : "CGI/Simple/Standard.pm", + "version" : "1.113" + }, + "CGI::Simple::Util" : { + "file" : "CGI/Simple/Util.pm", + "version" : "1.113" + } + }, + "version" : "1.113" + }, + "CPAN::Checksums" : { + "dist" : "CPAN-Checksums-2.07", + "module" : "CPAN::Checksums", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.5705, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "CPAN-Checksums", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Compress::Bzip2" : 0, + "Compress::Zlib" : 0, + "Data::Compare" : 0, + "Data::Dumper" : 0, + "Digest::MD5" : "2.36", + "Digest::SHA" : 0, + "DirHandle" : 0, + "File::Spec" : 0, + "File::Temp" : 0, + "IO::File" : "1.14" + } + } + }, + "release_status" : "stable", + "version" : "2.07" + }, + "name" : "CPAN::Checksums", + "pathname" : "/authors/id/A/AN/ANDK/CPAN-Checksums-2.07.tar.gz", + "provides" : { + "CPAN::Checksums" : { + "file" : "CPAN/Checksums.pm", + "version" : "2.07" + } + }, + "version" : "2.07" + }, + "CPAN::DistnameInfo" : { + "dist" : "CPAN-DistnameInfo-0.12", + "module" : "CPAN::DistnameInfo", + "mymeta" : { + "abstract" : "Extract distribution name and version from a distribution filename", + "author" : [ + "Graham Barr <gbarr@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "CPAN-DistnameInfo", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gbarr/CPAN-DistnameInfo" + } + }, + "version" : "0.12" + }, + "name" : "CPAN::DistnameInfo", + "pathname" : "G/GB/GBARR/CPAN-DistnameInfo-0.12.tar.gz", + "provides" : { + "CPAN::DistnameInfo" : { + "file" : "CPAN/DistnameInfo.pm", + "version" : "0.12" + } + }, + "version" : "0.12" + }, + "CPAN::PackageDetails" : { + "dist" : "CPAN-PackageDetails-0.25", + "module" : "CPAN::PackageDetails", + "mymeta" : { + "abstract" : "Create or read PAUSE's 02packages.details.txt.gz", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "CPAN-PackageDetails", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "CPAN::DistnameInfo" : 0, + "IO::Compress::Gzip" : 0, + "IO::Uncompress::Gunzip" : 0, + "Test::More" : 0, + "Test::Output" : "0.10", + "version" : "0.78" + } + } + }, + "release_status" : "stable", + "version" : "0.25" + }, + "name" : "CPAN::PackageDetails", + "pathname" : "/authors/id/B/BD/BDFOY/CPAN-PackageDetails-0.25.tar.gz", + "provides" : { + "CPAN::PackageDetails" : { + "file" : "CPAN/PackageDetails.pm", + "version" : "0.25" + }, + "CPAN::PackageDetails::Entries" : { + "file" : "CPAN/PackageDetails/Entries.pm", + "version" : "0.25" + }, + "CPAN::PackageDetails::Entry" : { + "file" : "CPAN/PackageDetails/Entry.pm", + "version" : "0.25" + }, + "CPAN::PackageDetails::Header" : { + "file" : "CPAN/PackageDetails/Header.pm", + "version" : "0.25" + } + }, + "version" : "0.25" + }, + "Cache::Memcached" : { + "dist" : "Cache-Memcached-1.29", + "module" : "Cache::Memcached", + "mymeta" : { + "abstract" : "client library for memcached (memory cache daemon)", + "author" : [ + "Brad Fitzpatrick <brad@danga.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Cache-Memcached", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Encode" : 0, + "Storable" : 0, + "String::CRC32" : 0, + "Time::HiRes" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.29" + }, + "name" : "Cache::Memcached", + "pathname" : "D/DO/DORMANDO/Cache-Memcached-1.29.tar.gz", + "provides" : { + "Cache::Memcached" : { + "file" : "Cache/Memcached.pm", + "version" : "1.29" + }, + "Cache::Memcached::GetParser" : { + "file" : "Cache/Memcached/GetParser.pm" + } + }, + "version" : "1.29" + }, + "Carp::Assert" : { + "dist" : "Carp-Assert-0.20", + "module" : "Carp::Assert", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.31, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Carp-Assert", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Test::More" : "0.4" + } + } + }, + "release_status" : "stable", + "version" : "0.20" + }, + "name" : "Carp::Assert", + "pathname" : "M/MS/MSCHWERN/Carp-Assert-0.20.tar.gz", + "provides" : { + "Carp::Assert" : { + "file" : "Carp/Assert.pm", + "version" : "0.20" + } + }, + "version" : "0.20" + }, + "Carp::Assert::More" : { + "dist" : "Carp-Assert-More-1.12", + "module" : "Carp::Assert::More", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Carp-Assert-More", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Carp::Assert" : 0, + "Scalar::Util" : 0, + "Test::Exception" : 0, + "Test::More" : "0.18" + } + } + }, + "release_status" : "stable", + "version" : "1.12", + "x_installdirs" : "site", + "x_version_from" : "More.pm" + }, + "name" : "Carp::Assert::More", + "pathname" : "P/PE/PETDANCE/Carp-Assert-More-1.12.tar.gz", + "provides" : { + "Carp::Assert::More" : { + "file" : "Carp/Assert/More.pm", + "version" : "1.12" + } + }, + "version" : "1.12" + }, + "Carp::Clan" : { + "dist" : "Carp-Clan-6.04", + "module" : "Carp::Clan", + "mymeta" : { + "abstract" : "Report errors from perspective of caller of a \"clan\" of modules", + "author" : [ + "Steffen Beyer <STBEY@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.42, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Carp-Clan", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Exception" : 0 + } + } + }, + "release_status" : "stable", + "version" : "6.04" + }, + "name" : "Carp::Clan", + "pathname" : "S/ST/STBEY/Carp-Clan-6.04.tar.gz", + "provides" : { + "Carp::Clan" : { + "file" : "Carp/Clan.pm", + "version" : "6.04" + } + }, + "version" : "6.04" + }, + "Catalyst::Action::RenderView" : { + "dist" : "Catalyst-Action-RenderView-0.16", + "module" : "Catalyst::Action::RenderView", + "mymeta" : { + "abstract" : "Sensible default end action.", + "author" : [ + "Marcus Ramberg <marcus@thefeed.no>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Action-RenderView", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "HTTP::Request::AsCGI" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Runtime" : "5.80030", + "Data::Visitor" : "0.24", + "MRO::Compat" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Action-RenderView/trunk/" + } + }, + "version" : "0.16" + }, + "name" : "Catalyst::Action::RenderView", + "pathname" : "B/BO/BOBTFISH/Catalyst-Action-RenderView-0.16.tar.gz", + "provides" : { + "Catalyst::Action::RenderView" : { + "file" : "Catalyst/Action/RenderView.pm", + "version" : "0.16" + } + }, + "version" : "0.16" + }, + "Catalyst::Authentication::Store::DBIx::Class" : { + "dist" : "Catalyst-Authentication-Store-DBIx-Class-0.1503", + "module" : "Catalyst::Authentication::Store::DBIx::Class", + "mymeta" : { + "abstract" : "A storage class for Catalyst Authentication using DBIx::Class", + "author" : [ + "Jason Kuri (jayk@cpan.org)" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Authentication-Store-DBIx-Class", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Model::DBIC::Schema" : "0.18", + "Catalyst::Plugin::Authentication" : "0.10008", + "Catalyst::Runtime" : "5.8", + "DBIx::Class" : "0.08", + "List::MoreUtils" : 0, + "Moose" : 0, + "Test::More" : 0, + "Try::Tiny" : 0, + "namespace::autoclean" : 0, + "perl" : "5.008001" + } + } + }, + "provides" : { + "Catalyst::Authentication::Realm::SimpleDB" : { + "file" : "lib/Catalyst/Authentication/Realm/SimpleDB.pm", + "version" : 0 + }, + "Catalyst::Authentication::Store::DBIx::Class" : { + "file" : "lib/Catalyst/Authentication/Store/DBIx/Class.pm", + "version" : "0.1503" + }, + "Catalyst::Authentication::Store::DBIx::Class::User" : { + "file" : "lib/Catalyst/Authentication/Store/DBIx/Class/User.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/catagits/Catalyst-Authentication-Store-DBIx-Class.git" + } + }, + "version" : "0.1503" + }, + "name" : "Catalyst::Authentication::Store::DBIx::Class", + "pathname" : "B/BO/BOBTFISH/Catalyst-Authentication-Store-DBIx-Class-0.1503.tar.gz", + "provides" : { + "Catalyst::Authentication::Realm::SimpleDB" : { + "file" : "Catalyst/Authentication/Realm/SimpleDB.pm" + }, + "Catalyst::Authentication::Store::DBIx::Class" : { + "file" : "Catalyst/Authentication/Store/DBIx/Class.pm", + "version" : "0.1503" + }, + "Catalyst::Authentication::Store::DBIx::Class::User" : { + "file" : "Catalyst/Authentication/Store/DBIx/Class/User.pm" + } + }, + "version" : "0.1503" + }, + "Catalyst::Component::InstancePerContext" : { + "dist" : "Catalyst-Component-InstancePerContext-0.001001", + "module" : "Catalyst::Component::InstancePerContext", + "mymeta" : { + "abstract" : "Moose role to create only one instance of component per context", + "author" : [ + "Guillermo Roditi (groditi) <groditi@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.67, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Component-InstancePerContext", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Catalyst" : 0, + "Moose" : 0, + "Scalar::Util" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.001001" + }, + "name" : "Catalyst::Component::InstancePerContext", + "pathname" : "G/GR/GRODITI/Catalyst-Component-InstancePerContext-0.001001.tar.gz", + "provides" : { + "Catalyst::Component::InstancePerContext" : { + "file" : "Catalyst/Component/InstancePerContext.pm", + "version" : "0.001001" + } + }, + "version" : "0.001001" + }, + "Catalyst::Model::Adaptor" : { + "dist" : "Catalyst-Model-Adaptor-0.10", + "module" : "Catalyst::Model::Adaptor", + "mymeta" : { + "abstract" : "use a plain class as a Catalyst model", + "author" : [ + "Jonathan Rockway C<< <jrockway@cpan.org> >>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Model-Adaptor", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : 0, + "ok" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Runtime" : 0, + "MRO::Compat" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/bobtfish/catalyst-model-adaptor.git" + } + }, + "version" : "0.10" + }, + "name" : "Catalyst::Model::Adaptor", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Model-Adaptor-0.10.tar.gz", + "provides" : { + "Catalyst::Helper::Model::Adaptor" : { + "file" : "Catalyst/Helper/Model/Adaptor.pm" + }, + "Catalyst::Helper::Model::Factory" : { + "file" : "Catalyst/Helper/Model/Factory.pm" + }, + "Catalyst::Helper::Model::Factory::PerRequest" : { + "file" : "Catalyst/Helper/Model/Factory/PerRequest.pm" + }, + "Catalyst::Model::Adaptor" : { + "file" : "Catalyst/Model/Adaptor.pm", + "version" : "0.10" + }, + "Catalyst::Model::Adaptor::Base" : { + "file" : "Catalyst/Model/Adaptor/Base.pm" + }, + "Catalyst::Model::Factory" : { + "file" : "Catalyst/Model/Factory.pm", + "version" : "0.10" + }, + "Catalyst::Model::Factory::PerRequest" : { + "file" : "Catalyst/Model/Factory/PerRequest.pm", + "version" : "0.10" + } + }, + "version" : "0.10" + }, + "Catalyst::Model::DBIC::Schema" : { + "dist" : "Catalyst-Model-DBIC-Schema-0.59", + "module" : "Catalyst::Model::DBIC::Schema", + "mymeta" : { + "abstract" : "DBIx::Class::Schema Model Class", + "author" : [ + "Brandon L Black C<blblack at gmail.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Model-DBIC-Schema", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "DBD::SQLite" : 0, + "ExtUtils::MakeMaker" : "6.42", + "Storable" : 0, + "Test::Exception" : 0, + "Test::More" : "0.94", + "Test::Requires" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Carp::Clan" : 0, + "Catalyst::Component::InstancePerContext" : 0, + "Catalyst::Runtime" : "5.80005", + "CatalystX::Component::Traits" : "0.14", + "DBD::SQLite" : 0, + "DBIx::Class" : "0.08114", + "List::MoreUtils" : 0, + "Moose" : "1.12", + "MooseX::Types" : 0, + "Storable" : 0, + "Test::Exception" : 0, + "Test::More" : "0.94", + "Test::Requires" : 0, + "Tie::IxHash" : 0, + "Try::Tiny" : 0, + "namespace::autoclean" : "0.09", + "namespace::clean" : 0, + "perl" : "5.008001" + } + } + }, + "provides" : { + "Catalyst::Helper::Model::DBIC::Schema" : { + "file" : "lib/Catalyst/Helper/Model/DBIC/Schema.pm", + "version" : "0.59" + }, + "Catalyst::Model::DBIC::Schema" : { + "file" : "lib/Catalyst/Model/DBIC/Schema.pm", + "version" : "0.59" + }, + "Catalyst::TraitFor::Model::DBIC::Schema::Caching" : { + "file" : "lib/Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm", + "version" : 0 + }, + "Catalyst::TraitFor::Model::DBIC::Schema::PerRequestSchema" : { + "file" : "lib/Catalyst/TraitFor/Model/DBIC/Schema/PerRequestSchema.pm", + "version" : 0 + }, + "Catalyst::TraitFor::Model::DBIC::Schema::Replicated" : { + "file" : "lib/Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm", + "version" : 0 + }, + "Catalyst::TraitFor::Model::DBIC::Schema::SchemaProxy" : { + "file" : "lib/Catalyst/TraitFor/Model/DBIC/Schema/SchemaProxy.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/catagits/Catalyst-Model-DBIC-Schema.git" + } + }, + "version" : "0.59" + }, + "name" : "Catalyst::Model::DBIC::Schema", + "pathname" : "R/RK/RKITOVER/Catalyst-Model-DBIC-Schema-0.59.tar.gz", + "provides" : { + "Catalyst::Helper::Model::DBIC::Schema" : { + "file" : "Catalyst/Helper/Model/DBIC/Schema.pm", + "version" : "0.59" + }, + "Catalyst::Model::DBIC::Schema" : { + "file" : "Catalyst/Model/DBIC/Schema.pm", + "version" : "0.59" + }, + "Catalyst::TraitFor::Model::DBIC::Schema::Caching" : { + "file" : "Catalyst/TraitFor/Model/DBIC/Schema/Caching.pm" + }, + "Catalyst::TraitFor::Model::DBIC::Schema::PerRequestSchema" : { + "file" : "Catalyst/TraitFor/Model/DBIC/Schema/PerRequestSchema.pm" + }, + "Catalyst::TraitFor::Model::DBIC::Schema::Replicated" : { + "file" : "Catalyst/TraitFor/Model/DBIC/Schema/Replicated.pm" + }, + "Catalyst::TraitFor::Model::DBIC::Schema::SchemaProxy" : { + "file" : "Catalyst/TraitFor/Model/DBIC/Schema/SchemaProxy.pm" + } + }, + "version" : "0.59" + }, + "Catalyst::Plugin::Authentication" : { + "dist" : "Catalyst-Plugin-Authentication-0.10017", + "module" : "Catalyst::Plugin::Authentication", + "mymeta" : { + "abstract" : "Infrastructure plugin for the Catalyst", + "author" : [ + "Yuval Kogman, C<nothingmuch@woobling.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Authentication", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Class::MOP" : 0, + "ExtUtils::MakeMaker" : "6.42", + "Moose" : 0, + "Test::Exception" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Plugin::Session" : "0.10", + "Catalyst::Runtime" : 0, + "Class::Inspector" : 0, + "Class::MOP" : 0, + "MRO::Compat" : 0, + "Moose" : 0, + "Test::Exception" : 0, + "Test::More" : "0.88", + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Authentication/0.10000/trunk" + } + }, + "version" : "0.10017" + }, + "name" : "Catalyst::Plugin::Authentication", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Authentication-0.10017.tar.gz", + "provides" : { + "Catalyst::Authentication::Credential::Password" : { + "file" : "Catalyst/Authentication/Credential/Password.pm" + }, + "Catalyst::Authentication::Credential::Remote" : { + "file" : "Catalyst/Authentication/Credential/Remote.pm" + }, + "Catalyst::Authentication::Realm" : { + "file" : "Catalyst/Authentication/Realm.pm" + }, + "Catalyst::Authentication::Realm::Compatibility" : { + "file" : "Catalyst/Authentication/Realm/Compatibility.pm" + }, + "Catalyst::Authentication::Realm::Progressive" : { + "file" : "Catalyst/Authentication/Realm/Progressive.pm" + }, + "Catalyst::Authentication::Store::Minimal" : { + "file" : "Catalyst/Authentication/Store/Minimal.pm" + }, + "Catalyst::Authentication::Store::Null" : { + "file" : "Catalyst/Authentication/Store/Null.pm" + }, + "Catalyst::Authentication::User" : { + "file" : "Catalyst/Authentication/User.pm" + }, + "Catalyst::Authentication::User::Hash" : { + "file" : "Catalyst/Authentication/User/Hash.pm" + }, + "Catalyst::Plugin::Authentication" : { + "file" : "Catalyst/Plugin/Authentication.pm", + "version" : "0.10017" + }, + "Catalyst::Plugin::Authentication::Credential::Password" : { + "file" : "Catalyst/Plugin/Authentication/Credential/Password.pm" + }, + "Catalyst::Plugin::Authentication::Store::Minimal" : { + "file" : "Catalyst/Plugin/Authentication/Store/Minimal.pm" + }, + "Catalyst::Plugin::Authentication::User" : { + "file" : "Catalyst/Plugin/Authentication/User.pm" + }, + "Catalyst::Plugin::Authentication::User::Hash" : { + "file" : "Catalyst/Plugin/Authentication/User/Hash.pm" + } + }, + "version" : "0.10017" + }, + "Catalyst::Plugin::Session" : { + "dist" : "Catalyst-Plugin-Session-0.31", + "module" : "Catalyst::Plugin::Session", + "mymeta" : { + "abstract" : "Generic Session plugin - ties together server side storage and client side state required to maintain session data.", + "author" : [ + "Andy Grundman" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Session", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::Deep" : 0, + "Test::Exception" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Runtime" : "5.71001", + "Digest" : 0, + "File::Spec" : 0, + "File::Temp" : 0, + "MRO::Compat" : 0, + "Moose" : "0.76", + "MooseX::Emulate::Class::Accessor::Fast" : "0.00801", + "Object::Signature" : 0, + "Test::More" : "0.88", + "Tie::RefHash" : "1.34", + "namespace::clean" : "0.10", + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Session/0.00/trunk/" + } + }, + "version" : "0.31" + }, + "name" : "Catalyst::Plugin::Session", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Session-0.31.tar.gz", + "provides" : { + "Catalyst::Plugin::Session" : { + "file" : "Catalyst/Plugin/Session.pm", + "version" : "0.31" + }, + "Catalyst::Plugin::Session::State" : { + "file" : "Catalyst/Plugin/Session/State.pm" + }, + "Catalyst::Plugin::Session::Store" : { + "file" : "Catalyst/Plugin/Session/Store.pm" + }, + "Catalyst::Plugin::Session::Store::Dummy" : { + "file" : "Catalyst/Plugin/Session/Store/Dummy.pm" + }, + "Catalyst::Plugin::Session::Test::Store" : { + "file" : "Catalyst/Plugin/Session/Test/Store.pm", + "version" : "123" + } + }, + "version" : "0.31" + }, + "Catalyst::Plugin::Session::State::Cookie" : { + "dist" : "Catalyst-Plugin-Session-State-Cookie-0.17", + "module" : "Catalyst::Plugin::Session::State::Cookie", + "mymeta" : { + "abstract" : "Maintain session IDs using cookies.", + "author" : [ + "Yuval Kogman <nothingmuch@woobling.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Session-State-Cookie", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst" : "5.80005", + "Catalyst::Plugin::Session" : "0.27", + "ExtUtils::MakeMaker" : "6.42", + "MRO::Compat" : 0, + "Moose" : 0, + "Test::More" : 0, + "namespace::autoclean" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Session-State-Cookie/trunk/" + } + }, + "version" : "0.17" + }, + "name" : "Catalyst::Plugin::Session::State::Cookie", + "pathname" : "M/MS/MSTROUT/Catalyst-Plugin-Session-State-Cookie-0.17.tar.gz", + "provides" : { + "Catalyst::Plugin::Session::State::Cookie" : { + "file" : "Catalyst/Plugin/Session/State/Cookie.pm", + "version" : "0.17" + } + }, + "version" : "0.17" + }, + "Catalyst::Plugin::Session::Store::DBIC" : { + "dist" : "Catalyst-Plugin-Session-Store-DBIC-0.12", + "module" : "Catalyst::Plugin::Session::Store::DBIC", + "mymeta" : { + "abstract" : "Store your sessions via DBIx::Class", + "author" : [ + "Daniel Westermann-Clark <danieltwc@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Session-Store-DBIC", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Catalyst" : "5.65", + "Catalyst::Exception" : 0, + "Catalyst::Plugin::Session::Store::Delegate" : "0.05", + "Class::Accessor::Fast" : 0, + "DBIx::Class" : "0.07000", + "FindBin" : 0, + "MIME::Base64" : 0, + "MRO::Compat" : 0, + "Scalar::Util" : 0, + "Storable" : 0, + "Test::More" : 0, + "Test::Warn" : "0.20" + } + } + }, + "release_status" : "stable", + "version" : "0.12", + "x_repository" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Session-Store-DBIC/" + }, + "name" : "Catalyst::Plugin::Session::Store::DBIC", + "pathname" : "F/FL/FLORA/Catalyst-Plugin-Session-Store-DBIC-0.12.tar.gz", + "provides" : { + "Catalyst::Plugin::Session::Store::DBIC" : { + "file" : "Catalyst/Plugin/Session/Store/DBIC.pm", + "version" : "0.12" + }, + "Catalyst::Plugin::Session::Store::DBIC::Delegate" : { + "file" : "Catalyst/Plugin/Session/Store/DBIC/Delegate.pm" + } + }, + "version" : "0.12" + }, + "Catalyst::Plugin::Session::Store::Delegate" : { + "dist" : "Catalyst-Plugin-Session-Store-Delegate-0.06", + "module" : "Catalyst::Plugin::Session::Store::Delegate", + "mymeta" : { + "abstract" : "Delegate session storage to an", + "author" : [ + "Yuval Kogman, C<nothingmuch@woobling.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Session-Store-Delegate", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Plugin::Session" : "0.27", + "ExtUtils::MakeMaker" : "6.42", + "MRO::Compat" : 0, + "Moose" : 0, + "MooseX::Emulate::Class::Accessor::Fast" : 0, + "Test::More" : 0, + "Test::use::ok" : 0, + "namespace::clean" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Session-Store-Delegate/" + } + }, + "version" : "0.06", + "x_module_name" : "Catalyst::Plugin::Session::Store::Delegate" + }, + "name" : "Catalyst::Plugin::Session::Store::Delegate", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Session-Store-Delegate-0.06.tar.gz", + "provides" : { + "Catalyst::Plugin::Session::Store::Delegate" : { + "file" : "Catalyst/Plugin/Session/Store/Delegate.pm", + "version" : "0.06" + } + }, + "version" : "0.06" + }, + "Catalyst::Plugin::SmartURI" : { + "dist" : "Catalyst-Plugin-SmartURI-0.036", + "module" : "Catalyst::Plugin::SmartURI", + "mymeta" : { + "abstract" : "Configurable URIs for Catalyst", + "author" : [ + "Rafael Kitover <rkitover@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-SmartURI", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst" : "5.80002", + "Class::C3::Componentised" : 0, + "ExtUtils::MakeMaker" : "6.42", + "Moose" : 0, + "Task::Weaken" : 0, + "Test::More" : 0, + "URI::SmartURI" : 0, + "namespace::clean" : 0, + "parent" : 0 + } + } + }, + "provides" : { + "Catalyst::Plugin::SmartURI" : { + "file" : "lib/Catalyst/Plugin/SmartURI.pm", + "version" : "0.036" + }, + "Catalyst::Request::SmartURI" : { + "file" : "lib/Catalyst/Plugin/SmartURI.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-SmartURI/1.000/trunk/" + } + }, + "version" : "0.036" + }, + "name" : "Catalyst::Plugin::SmartURI", + "pathname" : "R/RK/RKITOVER/Catalyst-Plugin-SmartURI-0.036.tar.gz", + "provides" : { + "Catalyst::Plugin::SmartURI" : { + "file" : "Catalyst/Plugin/SmartURI.pm", + "version" : "0.036" + }, + "Catalyst::Request::SmartURI" : { + "file" : "Catalyst/Plugin/SmartURI.pm" + } + }, + "version" : "0.036" + }, + "Catalyst::Plugin::Static::Simple" : { + "dist" : "Catalyst-Plugin-Static-Simple-0.29", + "module" : "Catalyst::Plugin::Static::Simple", + "mymeta" : { + "abstract" : "Make serving static pages painless.", + "author" : [ + "Andy Grundman, <andy@hybridized.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Static-Simple", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Runtime" : "5.80008", + "ExtUtils::MakeMaker" : "6.42", + "MIME::Types" : "1.25", + "Moose" : 0, + "MooseX::Types" : 0, + "Test::More" : 0, + "namespace::autoclean" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Static-Simple/trunk/" + } + }, + "version" : "0.29" + }, + "name" : "Catalyst::Plugin::Static::Simple", + "pathname" : "M/MS/MSTROUT/Catalyst-Plugin-Static-Simple-0.29.tar.gz", + "provides" : { + "Catalyst::Plugin::Static::Simple" : { + "file" : "Catalyst/Plugin/Static/Simple.pm", + "version" : "0.29" + } + }, + "version" : "0.29" + }, + "Catalyst::Plugin::Unicode" : { + "dist" : "Catalyst-Plugin-Unicode-0.93", + "module" : "Catalyst::Plugin::Unicode", + "mymeta" : { + "abstract" : "Unicode aware Catalyst (old style)", + "author" : [ + "Tomas Doran <bobtfish@bobtfish.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.910, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Unicode", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Runtime" : "5.70", + "ExtUtils::MakeMaker" : "6.42", + "IO::Scalar" : 0, + "MRO::Compat" : "0.10", + "Test::More" : 0, + "Test::WWW::Mechanize::Catalyst" : 0, + "ok" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/trunk/Catalyst-Plugin-Unicode/" + } + }, + "version" : "0.93" + }, + "name" : "Catalyst::Plugin::Unicode", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Unicode-0.93.tar.gz", + "provides" : { + "Catalyst::Plugin::Unicode" : { + "file" : "Catalyst/Plugin/Unicode.pm", + "version" : "0.93" + } + }, + "version" : "0.93" + }, + "Catalyst::Plugin::Unicode::Encoding" : { + "dist" : "Catalyst-Plugin-Unicode-Encoding-1.1", + "module" : "Catalyst::Plugin::Unicode::Encoding", + "mymeta" : { + "abstract" : "Unicode aware Catalyst", + "author" : [ + "Christian Hansen, C<ch@ngmedia.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Plugin-Unicode-Encoding", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "IO::Scalar" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst" : "5.80", + "Encode" : "2.21", + "LWP" : "5.828", + "URI" : "1.36" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Plugin-Unicode-Encoding/" + } + }, + "version" : "1.1", + "x_module_name" : "Catalyst::Plugin::Unicode::Encoding" + }, + "name" : "Catalyst::Plugin::Unicode::Encoding", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Plugin-Unicode-Encoding-1.1.tar.gz", + "provides" : { + "Catalyst::Plugin::Unicode::Encoding" : { + "file" : "Catalyst/Plugin/Unicode/Encoding.pm", + "version" : "1.1" + } + }, + "version" : "1.1" + }, + "Catalyst::Runtime" : { + "dist" : "Catalyst-Runtime-5.80032", + "module" : "Catalyst::Runtime", + "mymeta" : { + "abstract" : "The Catalyst Framework Runtime", + "author" : [ + "Catalyst Contributors, see Catalyst.pm" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-Runtime", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Class::Data::Inheritable" : 0, + "ExtUtils::MakeMaker" : "6.42", + "Test::Exception" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "B::Hooks::EndOfScope" : "0.08", + "CGI::Simple::Cookie" : "1.109", + "Carp" : 0, + "Class::C3::Adopt::NEXT" : "0.07", + "Class::Data::Inheritable" : 0, + "Class::MOP" : "0.95", + "Data::Dump" : 0, + "Data::OptList" : 0, + "HTML::Entities" : 0, + "HTML::HeadParser" : 0, + "HTTP::Body" : "1.06", + "HTTP::Headers" : "1.64", + "HTTP::Request" : "5.814", + "HTTP::Request::AsCGI" : "1.0", + "HTTP::Response" : "5.813", + "LWP::UserAgent" : 0, + "List::MoreUtils" : 0, + "MRO::Compat" : 0, + "Module::Pluggable" : "3.9", + "Moose" : "1.03", + "MooseX::Emulate::Class::Accessor::Fast" : "0.00903", + "MooseX::Getopt" : "0.30", + "MooseX::MethodAttributes::Inheritable" : "0.24", + "MooseX::Role::WithOverloading" : "0.09", + "MooseX::Types" : 0, + "MooseX::Types::Common::Numeric" : 0, + "Path::Class" : "0.09", + "Scalar::Util" : 0, + "String::RewritePrefix" : "0.004", + "Sub::Exporter" : 0, + "Task::Weaken" : 0, + "Test::Exception" : 0, + "Test::More" : "0.88", + "Text::Balanced" : 0, + "Text::SimpleTable" : "0.03", + "Time::HiRes" : 0, + "Tree::Simple" : "1.15", + "Tree::Simple::Visitor::FindByPath" : 0, + "URI" : "1.35", + "namespace::autoclean" : "0.09", + "namespace::clean" : "0.13", + "perl" : "5.008004" + } + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "http://dev.catalyst.perl.org/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/" + }, + "x_IRC" : "irc://irc.perl.org/#catalyst", + "x_MailingList" : "http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst" + }, + "version" : "5.80032" + }, + "name" : "Catalyst::Runtime", + "pathname" : "/authors/id/B/BO/BOBTFISH/Catalyst-Runtime-5.80032.tar.gz", + "provides" : { + "Catalyst" : { + "file" : "Catalyst.pm", + "version" : "5.80032" + }, + "Catalyst::Action" : { + "file" : "Catalyst/Action.pm" + }, + "Catalyst::ActionChain" : { + "file" : "Catalyst/ActionChain.pm" + }, + "Catalyst::ActionContainer" : { + "file" : "Catalyst/ActionContainer.pm" + }, + "Catalyst::Base" : { + "file" : "Catalyst/Base.pm" + }, + "Catalyst::ClassData" : { + "file" : "Catalyst/ClassData.pm" + }, + "Catalyst::Component" : { + "file" : "Catalyst/Component.pm" + }, + "Catalyst::Component::ApplicationAttribute" : { + "file" : "Catalyst/Component/ApplicationAttribute.pm" + }, + "Catalyst::Component::ContextClosure" : { + "file" : "Catalyst/Component/ContextClosure.pm" + }, + "Catalyst::Controller" : { + "file" : "Catalyst/Controller.pm" + }, + "Catalyst::DispatchType" : { + "file" : "Catalyst/DispatchType.pm" + }, + "Catalyst::DispatchType::Chained" : { + "file" : "Catalyst/DispatchType/Chained.pm" + }, + "Catalyst::DispatchType::Default" : { + "file" : "Catalyst/DispatchType/Default.pm" + }, + "Catalyst::DispatchType::Index" : { + "file" : "Catalyst/DispatchType/Index.pm" + }, + "Catalyst::DispatchType::Path" : { + "file" : "Catalyst/DispatchType/Path.pm" + }, + "Catalyst::DispatchType::Regex" : { + "file" : "Catalyst/DispatchType/Regex.pm" + }, + "Catalyst::Dispatcher" : { + "file" : "Catalyst/Dispatcher.pm" + }, + "Catalyst::Engine" : { + "file" : "Catalyst/Engine.pm" + }, + "Catalyst::Engine::CGI" : { + "file" : "Catalyst/Engine/CGI.pm" + }, + "Catalyst::Engine::FastCGI" : { + "file" : "Catalyst/Engine/FastCGI.pm" + }, + "Catalyst::Engine::HTTP" : { + "file" : "Catalyst/Engine/HTTP.pm" + }, + "Catalyst::Exception" : { + "file" : "Catalyst/Exception.pm" + }, + "Catalyst::Exception::Base" : { + "file" : "Catalyst/Exception.pm" + }, + "Catalyst::Exception::Basic" : { + "file" : "Catalyst/Exception/Basic.pm" + }, + "Catalyst::Exception::Detach" : { + "file" : "Catalyst/Exception/Detach.pm" + }, + "Catalyst::Exception::Go" : { + "file" : "Catalyst/Exception/Go.pm" + }, + "Catalyst::Exception::Interface" : { + "file" : "Catalyst/Exception/Interface.pm" + }, + "Catalyst::Log" : { + "file" : "Catalyst/Log.pm" + }, + "Catalyst::Model" : { + "file" : "Catalyst/Model.pm" + }, + "Catalyst::Request" : { + "file" : "Catalyst/Request.pm" + }, + "Catalyst::Request::Upload" : { + "file" : "Catalyst/Request/Upload.pm" + }, + "Catalyst::Response" : { + "file" : "Catalyst/Response.pm" + }, + "Catalyst::Runtime" : { + "file" : "Catalyst/Runtime.pm", + "version" : "5.80032" + }, + "Catalyst::Script::CGI" : { + "file" : "Catalyst/Script/CGI.pm" + }, + "Catalyst::Script::Create" : { + "file" : "Catalyst/Script/Create.pm" + }, + "Catalyst::Script::FastCGI" : { + "file" : "Catalyst/Script/FastCGI.pm" + }, + "Catalyst::Script::Server" : { + "file" : "Catalyst/Script/Server.pm" + }, + "Catalyst::Script::Test" : { + "file" : "Catalyst/Script/Test.pm" + }, + "Catalyst::ScriptRole" : { + "file" : "Catalyst/ScriptRole.pm" + }, + "Catalyst::ScriptRunner" : { + "file" : "Catalyst/ScriptRunner.pm" + }, + "Catalyst::Stats" : { + "file" : "Catalyst/Stats.pm" + }, + "Catalyst::Test" : { + "file" : "Catalyst/Test.pm" + }, + "Catalyst::Utils" : { + "file" : "Catalyst/Utils.pm" + }, + "Catalyst::View" : { + "file" : "Catalyst/View.pm" + } + }, + "version" : "5.80032" + }, + "Catalyst::View::TT" : { + "dist" : "Catalyst-View-TT-0.36", + "module" : "Catalyst::View::TT", + "mymeta" : { + "abstract" : "Template View Class", + "author" : [ + "Sebastian Riedel, C<sri@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Catalyst-View-TT", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst" : "5.7", + "Class::Accessor" : 0, + "MRO::Compat" : 0, + "Path::Class" : 0, + "Template" : 0, + "Template::Timer" : 0, + "Test::More" : 0, + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-View-TT/" + } + }, + "version" : "0.36" + }, + "name" : "Catalyst::View::TT", + "pathname" : "/authors/id/A/AB/ABRAXXA/Catalyst-View-TT-0.36.tar.gz", + "provides" : { + "Catalyst::Helper::View::TT" : { + "file" : "Catalyst/Helper/View/TT.pm" + }, + "Catalyst::Helper::View::TTSite" : { + "file" : "Catalyst/Helper/View/TTSite.pm" + }, + "Catalyst::View::TT" : { + "file" : "Catalyst/View/TT.pm", + "version" : "0.36" + } + }, + "version" : "0.36" + }, + "CatalystX::Component::Traits" : { + "dist" : "CatalystX-Component-Traits-0.16", + "module" : "CatalystX::Component::Traits", + "mymeta" : { + "abstract" : "Automatic Trait Loading and Resolution for", + "author" : [ + "Rafael Kitover, C<< <rkitover@cpan.org> >>", + "Rafael Kitover <bobtfish@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "CatalystX-Component-Traits", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Module::Pluggable" : "3.9", + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst::Runtime" : "5.80005", + "List::MoreUtils" : 0, + "Module::Pluggable" : "3.9", + "MooseX::Traits::Pluggable" : "0.08", + "Scalar::Util" : 0, + "Test::More" : "0.88", + "namespace::autoclean" : 0 + } + } + }, + "provides" : { + "CatalystX::Component::Traits" : { + "file" : "lib/CatalystX/Component/Traits.pm", + "version" : "0.16" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/bobtfish/catalystx-component-traits.git" + } + }, + "version" : "0.16" + }, + "name" : "CatalystX::Component::Traits", + "pathname" : "/authors/id/B/BO/BOBTFISH/CatalystX-Component-Traits-0.16.tar.gz", + "provides" : { + "CatalystX::Component::Traits" : { + "file" : "CatalystX/Component/Traits.pm", + "version" : "0.16" + } + }, + "version" : "0.16" + }, + "Class::Accessor" : { + "dist" : "Class-Accessor-0.34", + "module" : "Class::Accessor", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "Marty Pauley <marty+perl@kasei.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.42, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Accessor", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "base" : "1.01" + } + } + }, + "release_status" : "stable", + "version" : "0.34" + }, + "name" : "Class::Accessor", + "pathname" : "K/KA/KASEI/Class-Accessor-0.34.tar.gz", + "provides" : { + "Class::Accessor" : { + "file" : "Class/Accessor.pm", + "version" : "0.34" + }, + "Class::Accessor::Fast" : { + "file" : "Class/Accessor/Fast.pm", + "version" : "0.34" + }, + "Class::Accessor::Faster" : { + "file" : "Class/Accessor/Faster.pm", + "version" : "0.34" + } + }, + "version" : "0.34" + }, + "Class::Accessor::Chained" : { + "dist" : "Class-Accessor-Chained-0.01", + "module" : "Class::Accessor::Chained::Fast", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Accessor-Chained", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "runtime" : { + "requires" : { + "Class::Accessor" : 0 + } + } + }, + "provides" : { + "Class::Accessor::Chained" : { + "file" : "lib/Class/Accessor/Chained.pm", + "version" : "0.01" + }, + "Class::Accessor::Chained::Fast" : { + "file" : "lib/Class/Accessor/Chained/Fast.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "version" : "0.01" + }, + "name" : "Class::Accessor::Chained", + "pathname" : "R/RC/RCLAMP/Class-Accessor-Chained-0.01.tar.gz", + "provides" : { + "Class::Accessor::Chained" : { + "file" : "Class/Accessor/Chained.pm", + "version" : "0.01" + }, + "Class::Accessor::Chained::Fast" : { + "file" : "Class/Accessor/Chained/Fast.pm" + } + }, + "version" : "0.01" + }, + "Class::Accessor::Grouped" : { + "dist" : "Class-Accessor-Grouped-0.10003", + "module" : "Class::Accessor::Grouped", + "mymeta" : { + "abstract" : "Lets you build groups of accessors", + "author" : [ + "Matt S. Trout <mst@shadowcatsystems.co.uk>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Accessor-Grouped", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::Exception" : "0.31", + "Test::More" : "0.94" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Class::Inspector" : 0, + "Class::XSAccessor" : "1.11", + "Scalar::Util" : 0, + "Sub::Name" : "0.05", + "Test::Exception" : "0.31", + "Test::More" : "0.94", + "perl" : "5.006002" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/p5sagit/Class-Accessor-Grouped.git" + } + }, + "version" : "0.10003" + }, + "name" : "Class::Accessor::Grouped", + "pathname" : "authors/id/F/FR/FREW/Class-Accessor-Grouped-0.10003.tar.gz", + "provides" : { + "Class::Accessor::Grouped" : { + "file" : "Class/Accessor/Grouped.pm", + "version" : "0.10003" + } + }, + "version" : "0.10003" + }, + "Class::C3" : { + "dist" : "Class-C3-0.23", + "module" : "Class::C3", + "mymeta" : { + "abstract" : "A pragma to use the C3 method resolution order algortihm", + "author" : [ + "Stevan Little, <stevan@iinteractive.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-C3", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.23" + }, + "name" : "Class::C3", + "pathname" : "F/FL/FLORA/Class-C3-0.23.tar.gz", + "provides" : { + "Class::C3" : { + "file" : "Class/C3.pm", + "version" : "0.23" + } + }, + "version" : "0.23" + }, + "Class::C3::Adopt::NEXT" : { + "dist" : "Class-C3-Adopt-NEXT-0.13", + "module" : "Class::C3::Adopt::NEXT", + "mymeta" : { + "abstract" : "make NEXT suck less", + "author" : [ + "Florian Ragwitz <rafl@debian.org>", + "Tomas Doran <bobtfish@bobtfish.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 2.101241, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-C3-Adopt-NEXT", + "prereqs" : { + "build" : { + "requires" : { + "FindBin" : 0, + "Test::Exception" : "0.27", + "Test::More" : 0, + "vars" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "recommends" : {}, + "requires" : { + "List::MoreUtils" : 0, + "MRO::Compat" : 0, + "NEXT" : 0, + "warnings::register" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=Class-C3-Adopt-NEXT" + }, + "homepage" : "http://search.cpan.org/dist/Class-C3-Adopt-NEXT", + "repository" : { + "type" : "git", + "url" : "git://github.com/rafl/class-c3-adopt-next.git" + } + }, + "version" : "0.13", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@FLORA/@Filter/GatherDir", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@FLORA/@Filter/PruneCruft", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@FLORA/@Filter/ManifestSkip", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@FLORA/@Filter/MetaYAML", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@FLORA/@Filter/License", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@FLORA/@Filter/Readme", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@FLORA/@Filter/PkgVersion", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@FLORA/@Filter/PodCoverageTests", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@FLORA/@Filter/PodSyntaxTests", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@FLORA/@Filter/ExtraTests", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@FLORA/@Filter/ExecDir", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@FLORA/@Filter/ShareDir", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@FLORA/@Filter/MakeMaker", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@FLORA/@Filter/Manifest", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@FLORA/@Filter/ConfirmRelease", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@FLORA/@Filter/UploadToCPAN", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@FLORA/MetaConfig", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@FLORA/MetaJSON", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@FLORA/MetaResources", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@FLORA/Authority", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@FLORA/PodWeaver", + "version" : "3.100710" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereq", + "name" : "AutoPrereq", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "2.101241" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "2.101241" + } + ], + "zilla" : { + "class" : "Dist::Zilla", + "config" : { + "is_trial" : 0 + }, + "version" : "2.101241" + } + }, + "x_authority" : "cpan:FLORA" + }, + "name" : "Class::C3::Adopt::NEXT", + "pathname" : "F/FL/FLORA/Class-C3-Adopt-NEXT-0.13.tar.gz", + "provides" : { + "Class::C3::Adopt::NEXT" : { + "file" : "Class/C3/Adopt/NEXT.pm", + "version" : "0.13" + } + }, + "version" : "0.13" + }, + "Class::C3::Componentised" : { + "dist" : "Class-C3-Componentised-1.001000", + "module" : "Class::C3::Componentised", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "Ash Berlin <ash@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-C3-Componentised", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Class::C3" : "0.20", + "Class::Inspector" : 0, + "MRO::Compat" : 0, + "Test::Exception" : 0, + "perl" : "5.006002" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/p5sagit/Class-C3-Componentised.git" + } + }, + "version" : "1.001000" + }, + "name" : "Class::C3::Componentised", + "pathname" : "F/FR/FREW/Class-C3-Componentised-1.001000.tar.gz", + "provides" : { + "Class::C3::Componentised" : { + "file" : "Class/C3/Componentised.pm", + "version" : "1.001000" + }, + "Class::C3::Componentised::ApplyHooks" : { + "file" : "Class/C3/Componentised/ApplyHooks.pm" + } + }, + "version" : "1.001000" + }, + "Class::Data::Inheritable" : { + "dist" : "Class-Data-Inheritable-0.08", + "module" : "Class::Data::Inheritable", + "mymeta" : { + "abstract" : "Inheritable, overridable class data", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.42, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Data-Inheritable", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "0.08" + }, + "name" : "Class::Data::Inheritable", + "pathname" : "T/TM/TMTM/Class-Data-Inheritable-0.08.tar.gz", + "provides" : { + "Class::Data::Inheritable" : { + "file" : "Class/Data/Inheritable.pm", + "version" : "0.08" + } + }, + "version" : "0.08" + }, + "Class::Factory::Util" : { + "dist" : "Class-Factory-Util-1.7", + "module" : "Class::Factory::Util", + "mymeta" : { + "abstract" : "Provide utility methods for factory classes", + "author" : [ + "Dave Rolsky, <autarch@urth.org>.", + "Removed from Alzabo and packaged by Terrence Brannon,\n<tbone@cpan.org>." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Factory-Util", + "prereqs" : {}, + "provides" : { + "Class::Factory::Util" : { + "file" : "lib/Class/Factory/Util.pm", + "version" : "1.7" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "1.7" + }, + "name" : "Class::Factory::Util", + "pathname" : "D/DR/DROLSKY/Class-Factory-Util-1.7.tar.gz", + "provides" : { + "Class::Factory::Util" : { + "file" : "Class/Factory/Util.pm", + "version" : "1.7" + } + }, + "version" : "1.7" + }, + "Class::Inspector" : { + "dist" : "Class-Inspector-1.25", + "module" : "Class::Inspector", + "mymeta" : { + "abstract" : "Get information about a class and its structure", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Inspector", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : "0.47" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "File::Spec" : "0.80", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/Class-Inspector" + }, + "x_ChangeLog" : "http://fisheye2.atlassian.com/changelog/cpan/trunk/Class-Inspector" + }, + "version" : "1.25", + "x_module_name" : "Class::Inspector" + }, + "name" : "Class::Inspector", + "pathname" : "/authors/id/A/AD/ADAMK/Class-Inspector-1.25.tar.gz", + "provides" : { + "Class::Inspector" : { + "file" : "Class/Inspector.pm", + "version" : "1.25" + }, + "Class::Inspector::Functions" : { + "file" : "Class/Inspector/Functions.pm", + "version" : "1.25" + } + }, + "version" : "1.25" + }, + "Class::Load" : { + "dist" : "Class-Load-0.12", + "module" : "Class::Load", + "mymeta" : { + "abstract" : "a working (require \"Class::Name\") and more", + "author" : [ + "Shawn M Moore <sartak at bestpractical.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300002, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Load", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "Data::OptList" : 0, + "Module::Runtime" : "0.011", + "Package::Stash" : "0.32", + "Scalar::Util" : 0, + "Try::Tiny" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Class-Load" + }, + "repository" : { + "type" : "git", + "url" : "git://github.com/autarch/class-load.git" + } + }, + "version" : "0.12" + }, + "name" : "Class::Load", + "pathname" : "D/DR/DROLSKY/Class-Load-0.12.tar.gz", + "provides" : { + "Class::Load" : { + "file" : "Class/Load.pm", + "version" : "0.12" + }, + "Class::Load::PP" : { + "file" : "Class/Load/PP.pm", + "version" : "0.12" + } + }, + "version" : "0.12" + }, + "Class::Load::XS" : { + "dist" : "Class-Load-XS-0.03", + "module" : "Class::Load::XS", + "mymeta" : { + "abstract" : "XS implementation of parts of Class::Load", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Load-XS", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::CBuilder" : 0, + "Module::Build" : "0.3601", + "Test::Fatal" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.3601" + } + }, + "runtime" : { + "requires" : { + "Class::Load" : "0.11" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Class-Load-XS" + }, + "repository" : { + "type" : "git", + "url" : "git://git.urth.org/Class-Load-XS.git" + } + }, + "version" : "0.03" + }, + "name" : "Class::Load::XS", + "pathname" : "D/DR/DROLSKY/Class-Load-XS-0.03.tar.gz", + "provides" : { + "Class::Load::XS" : { + "file" : "Class/Load/XS.pm", + "version" : "0.03" + } + }, + "version" : "0.03" + }, + "Class::Mix" : { + "dist" : "Class-Mix-0.005", + "module" : "Class::Mix", + "mymeta" : { + "abstract" : "dynamic class mixing", + "author" : [ + "Andrew Main (Zefram) <zefram@fysh.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Mix", + "prereqs" : { + "build" : { + "requires" : { + "Module::Build" : 0, + "Test::More" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Exporter" : 0, + "Params::Classify" : 0, + "constant" : 0, + "if" : 0, + "parent" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + } + }, + "provides" : { + "Class::Mix" : { + "file" : "lib/Class/Mix.pm", + "version" : "0.005" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.005" + }, + "name" : "Class::Mix", + "pathname" : "Z/ZE/ZEFRAM/Class-Mix-0.005.tar.gz", + "provides" : { + "Class::Mix" : { + "file" : "Class/Mix.pm", + "version" : "0.005" + } + }, + "version" : "0.005" + }, + "Class::Singleton" : { + "dist" : "Class-Singleton-1.4", + "module" : "Class::Singleton", + "mymeta" : { + "abstract" : "Base class for creating singleton objects", + "author" : [ + "Andy Wardley <abw@wardley.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.31, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Singleton", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.4" + }, + "name" : "Class::Singleton", + "pathname" : "A/AB/ABW/Class-Singleton-1.4.tar.gz", + "provides" : { + "Class::Singleton" : { + "file" : "Class/Singleton.pm", + "version" : "1.4" + } + }, + "version" : "1.4" + }, + "Class::Unload" : { + "dist" : "Class-Unload-0.07", + "module" : "Class::Unload", + "mymeta" : { + "abstract" : "Unload a class", + "author" : [ + "Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>;" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200001, CPAN::Meta::Converter version 2.102400, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-Unload", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "Class::Inspector" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.07" + }, + "name" : "Class::Unload", + "pathname" : "I/IL/ILMARI/Class-Unload-0.07.tar.gz", + "provides" : { + "Class::Unload" : { + "file" : "Class/Unload.pm", + "version" : "0.07" + } + }, + "version" : "0.07" + }, + "Class::XSAccessor" : { + "dist" : "Class-XSAccessor-1.13", + "module" : "Class::XSAccessor", + "mymeta" : { + "abstract" : "Generate fast XS accessors without runtime compilation", + "author" : [ + "Steffen Mueller <smueller@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Class-XSAccessor", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "XSLoader" : 0, + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/tsee/Class-XSAccessor.git" + } + }, + "version" : "1.13" + }, + "name" : "Class::XSAccessor", + "pathname" : "S/SM/SMUELLER/Class-XSAccessor-1.13.tar.gz", + "provides" : { + "Class::XSAccessor" : { + "file" : "Class/XSAccessor.pm", + "version" : "1.13" + }, + "Class::XSAccessor::Array" : { + "file" : "Class/XSAccessor/Array.pm", + "version" : "1.13" + } + }, + "version" : "1.13" + }, + "Clone" : { + "dist" : "Clone-0.31", + "module" : "Clone", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Clone", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "0.31", + "x_installdirs" : "site", + "x_version_from" : "Clone.pm" + }, + "name" : "Clone", + "pathname" : "R/RD/RDF/Clone-0.31.tar.gz", + "provides" : { + "Clone" : { + "file" : "Clone.pm", + "version" : "0.31" + } + }, + "version" : "0.31" + }, + "Compress::Bzip2" : { + "dist" : "Compress-Bzip2-2.09", + "module" : "Compress::Bzip2", + "mymeta" : { + "abstract" : "Interface to Bzip2 compression library", + "author" : [ + "Rob Janes <arjay@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Compress-Bzip2", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Config" : 0, + "Fcntl" : 0, + "File::Copy" : 0, + "File::Spec" : 0, + "Getopt::Std" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "2.09" + }, + "name" : "Compress::Bzip2", + "pathname" : "/authors/id/A/AR/ARJAY/Compress-Bzip2-2.09.tar.gz", + "provides" : { + "Compress::Bzip2" : { + "file" : "Compress/Bzip2.pm", + "version" : "2.09" + } + }, + "version" : "2.09" + }, + "Config::Any" : { + "dist" : "Config-Any-0.20", + "module" : "Config::Any", + "mymeta" : { + "abstract" : "Load configuration from different file formats, transparently", + "author" : [ + "Joel Bernstein <rataxis@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Config-Any", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Module::Pluggable" : "3.01", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/trunk/Config-Any/" + } + }, + "version" : "0.20" + }, + "name" : "Config::Any", + "pathname" : "/authors/id/B/BR/BRICAS/Config-Any-0.20.tar.gz", + "provides" : { + "Config::Any" : { + "file" : "Config/Any.pm", + "version" : "0.20" + }, + "Config::Any::Base" : { + "file" : "Config/Any/Base.pm" + }, + "Config::Any::General" : { + "file" : "Config/Any/General.pm" + }, + "Config::Any::INI" : { + "file" : "Config/Any/INI.pm" + }, + "Config::Any::JSON" : { + "file" : "Config/Any/JSON.pm" + }, + "Config::Any::Perl" : { + "file" : "Config/Any/Perl.pm" + }, + "Config::Any::XML" : { + "file" : "Config/Any/XML.pm" + }, + "Config::Any::YAML" : { + "file" : "Config/Any/YAML.pm" + } + }, + "version" : "0.20" + }, + "ConfigReader::Simple" : { + "dist" : "ConfigReader-Simple-1.28", + "module" : "ConfigReader::Simple", + "mymeta" : { + "abstract" : "Simple configuration file parser", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "keywords" : [ + "testing", + "STDOUT", + "STDERR" + ], + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "ConfigReader-Simple", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Output" : 0, + "Test::Warn" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/briandfoy/test-output.git" + } + }, + "version" : "1.28" + }, + "name" : "ConfigReader::Simple", + "pathname" : "/authors/id/B/BD/BDFOY/ConfigReader-Simple-1.28.tar.gz", + "provides" : { + "ConfigReader::Simple" : { + "file" : "ConfigReader/Simple.pm", + "version" : "1.28" + } + }, + "version" : "1.28" + }, + "Context::Preserve" : { + "dist" : "Context-Preserve-0.01", + "module" : "Context::Preserve", + "mymeta" : { + "abstract" : "run code after a subroutine call, preserving the context the subroutine would have seen if it were the last statement in the caller", + "author" : [ + "AND COPYRIGHT" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.68, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Context-Preserve", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Exporter" : 0, + "Test::Exception" : 0, + "Test::More" : 0, + "ok" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.01" + }, + "name" : "Context::Preserve", + "pathname" : "J/JR/JROCKWAY/Context-Preserve-0.01.tar.gz", + "provides" : { + "Context::Preserve" : { + "file" : "Context/Preserve.pm", + "version" : "0.01" + } + }, + "version" : "0.01" + }, + "Crypt::Eksblowfish" : { + "dist" : "Crypt-Eksblowfish-0.009", + "module" : "Crypt::Eksblowfish", + "mymeta" : { + "abstract" : "the Eksblowfish block cipher", + "author" : [ + "Solar Designer (solar at openwall.com)", + "Andrew Main (Zefram) <zefram@fysh.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Crypt-Eksblowfish", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::CBuilder" : "0.15", + "Module::Build" : 0, + "Test::More" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Class::Mix" : "0.001", + "Exporter" : 0, + "MIME::Base64" : "2.21", + "XSLoader" : 0, + "parent" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + } + }, + "provides" : { + "Crypt::Eksblowfish" : { + "file" : "lib/Crypt/Eksblowfish.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Bcrypt" : { + "file" : "lib/Crypt/Eksblowfish/Bcrypt.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Blowfish" : { + "file" : "lib/Crypt/Eksblowfish/Blowfish.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Family" : { + "file" : "lib/Crypt/Eksblowfish/Family.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Subkeyed" : { + "file" : "lib/Crypt/Eksblowfish/Subkeyed.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Uklblowfish" : { + "file" : "lib/Crypt/Eksblowfish/Uklblowfish.pm", + "version" : "0.009" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.009" + }, + "name" : "Crypt::Eksblowfish", + "pathname" : "Z/ZE/ZEFRAM/Crypt-Eksblowfish-0.009.tar.gz", + "provides" : { + "Crypt::Eksblowfish" : { + "file" : "Crypt/Eksblowfish.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Bcrypt" : { + "file" : "Crypt/Eksblowfish/Bcrypt.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Blowfish" : { + "file" : "Crypt/Eksblowfish/Blowfish.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Family" : { + "file" : "Crypt/Eksblowfish/Family.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Subkeyed" : { + "file" : "Crypt/Eksblowfish/Subkeyed.pm", + "version" : "0.009" + }, + "Crypt::Eksblowfish::Uklblowfish" : { + "file" : "Crypt/Eksblowfish/Uklblowfish.pm", + "version" : "0.009" + } + }, + "version" : "0.009" + }, + "DBD::Pg" : { + "dist" : "DBD-Pg-2.18.1", + "module" : "DBD::Pg", + "mymeta" : { + "abstract" : "DBI PostgreSQL interface", + "author" : [ + "Greg Sabino Mullane <greg@turnstep.com>" + ], + "dynamic_config" : 0, + "generated_by" : "emacs, CPAN::Meta::Converter version 2.112150", + "keywords" : [ + "Postgres", + "PostgreSQL", + "DBI", + "libpq", + "dbdpg" + ], + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DBD-Pg", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "DBI" : "1.52", + "version" : 0 + } + }, + "runtime" : { + "recommends" : { + "Cwd" : 0, + "Encode" : 0, + "File::Comments" : 0, + "File::Comments::Plugin::C" : 0, + "File::Temp" : 0, + "Module::Signature" : "0.50", + "Perl::Critic" : 0, + "Pod::Spell" : 0, + "Test::Pod" : "0.95", + "Test::Pod::Coverage" : 0, + "Test::Warn" : "0.08", + "Test::YAML::Meta" : "0.03", + "Text::SpellChecker" : 0, + "Time::HiRes" : 0 + }, + "requires" : { + "DBI" : "1.52", + "ExtUtils::MakeMaker" : "6.11", + "Test::More" : "0.61", + "version" : 0 + } + } + }, + "provides" : { + "Bundle::DBD::Pg" : { + "file" : "lib/Bundle/DBD/Pg.pm", + "version" : "v2.18.1" + }, + "DBD::Pg" : { + "file" : "Pg.pm", + "version" : "v2.18.1" + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=DBD-Pg" + }, + "homepage" : "http://search.cpan.org/dist/DBD-Pg/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.perl.org/modules/DBD-Pg/trunk/" + }, + "x_MailingList" : "http://www.nntp.perl.org/group/perl.dbd.pg/" + }, + "version" : "2.18.1" + }, + "name" : "DBD::Pg", + "pathname" : "T/TU/TURNSTEP/DBD-Pg-2.18.1.tar.gz", + "provides" : { + "Bundle::DBD::Pg" : { + "file" : "Bundle/DBD/Pg.pm", + "version" : "v2.18.1" + }, + "DBD::Pg" : { + "file" : "DBD/Pg.pm", + "version" : "v2.18.1" + }, + "DBD::Pg::DefaultValue" : { + "file" : "DBD/Pg.pm" + }, + "DBD::Pg::db" : { + "file" : "DBD/Pg.pm" + }, + "DBD::Pg::dr" : { + "file" : "DBD/Pg.pm" + }, + "DBD::Pg::st" : { + "file" : "DBD/Pg.pm" + } + }, + "version" : "v2.18.1" + }, + "DBD::SQLite" : { + "dist" : "DBD-SQLite-1.31", + "module" : "DBD::SQLite", + "mymeta" : { + "abstract" : "Self Contained SQLite RDBMS in a DBI Driver", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DBD-SQLite", + "no_index" : { + "directory" : [ + "t", + "inc", + "util" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "DBI" : "1.57", + "ExtUtils::MakeMaker" : "6.48", + "File::Spec" : "0.82" + } + }, + "runtime" : { + "requires" : { + "DBI" : "1.57", + "File::Spec" : "0.82", + "Test::Builder" : "0.86", + "Test::More" : "0.47", + "Tie::Hash" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=DBD-SQLite" + }, + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/DBD-SQLite" + }, + "x_MailingList" : "http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbd-sqlite" + }, + "version" : "1.31" + }, + "name" : "DBD::SQLite", + "pathname" : "/authors/id/A/AD/ADAMK/DBD-SQLite-1.31.tar.gz", + "provides" : { + "DBD::SQLite" : { + "file" : "DBD/SQLite.pm", + "version" : "1.31" + }, + "DBD::SQLite::db" : { + "file" : "DBD/SQLite.pm" + }, + "DBD::SQLite::dr" : { + "file" : "DBD/SQLite.pm" + } + }, + "version" : "1.31" + }, + "DBI" : { + "dist" : "DBI-1.616", + "module" : "DBI", + "mymeta" : { + "abstract" : "Database independent interface for Perl", + "author" : [ + "Tim Bunce (dbi-users@perl.org)" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DBI", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.48", + "Test::Simple" : "0.90" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "conflicts" : { + "DBD::AnyData" : "0.09", + "DBD::CSV" : "0.29", + "DBD::PO" : "2.10", + "DBD::RAM" : "0.072", + "SQL::Statement" : "1.27" + }, + "recommends" : { + "Clone" : "0.31", + "DB_File" : 0, + "MLDBM" : 0, + "Net::Daemon" : 0, + "RPC::PlServer" : "0.2001", + "SQL::Statement" : "1.28" + }, + "requires" : { + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "http://dbi.perl.org/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "https://svn.perl.org/modules/dbi/trunk/" + }, + "x_MailingList" : "mailto:dbi-dev@perl.org" + }, + "version" : "1.616" + }, + "name" : "DBI", + "pathname" : "T/TI/TIMB/DBI-1.616.tar.gz", + "provides" : { + "Bundle::DBI" : { + "file" : "Bundle/DBI.pm", + "version" : "12.008695" + }, + "DBD::DBM" : { + "file" : "DBD/DBM.pm", + "version" : "0.06" + }, + "DBD::DBM::Statement" : { + "file" : "DBD/DBM.pm" + }, + "DBD::DBM::Table" : { + "file" : "DBD/DBM.pm" + }, + "DBD::DBM::db" : { + "file" : "DBD/DBM.pm" + }, + "DBD::DBM::dr" : { + "file" : "DBD/DBM.pm" + }, + "DBD::DBM::st" : { + "file" : "DBD/DBM.pm" + }, + "DBD::ExampleP" : { + "file" : "DBD/ExampleP.pm", + "version" : "12.014310" + }, + "DBD::ExampleP::db" : { + "file" : "DBD/ExampleP.pm" + }, + "DBD::ExampleP::dr" : { + "file" : "DBD/ExampleP.pm" + }, + "DBD::ExampleP::st" : { + "file" : "DBD/ExampleP.pm" + }, + "DBD::File" : { + "file" : "DBD/File.pm", + "version" : "0.40" + }, + "DBD::File::Statement" : { + "file" : "DBD/File.pm" + }, + "DBD::File::Table" : { + "file" : "DBD/File.pm" + }, + "DBD::File::TieMeta" : { + "file" : "DBD/File.pm" + }, + "DBD::File::TieTables" : { + "file" : "DBD/File.pm" + }, + "DBD::File::db" : { + "file" : "DBD/File.pm" + }, + "DBD::File::dr" : { + "file" : "DBD/File.pm" + }, + "DBD::File::st" : { + "file" : "DBD/File.pm" + }, + "DBD::Gofer" : { + "file" : "DBD/Gofer.pm", + "version" : "0.014282" + }, + "DBD::Gofer::Policy::Base" : { + "file" : "DBD/Gofer/Policy/Base.pm", + "version" : "0.010087" + }, + "DBD::Gofer::Policy::classic" : { + "file" : "DBD/Gofer/Policy/classic.pm", + "version" : "0.010087" + }, + "DBD::Gofer::Policy::pedantic" : { + "file" : "DBD/Gofer/Policy/pedantic.pm", + "version" : "0.010087" + }, + "DBD::Gofer::Policy::rush" : { + "file" : "DBD/Gofer/Policy/rush.pm", + "version" : "0.010087" + }, + "DBD::Gofer::Transport::Base" : { + "file" : "DBD/Gofer/Transport/Base.pm", + "version" : "0.014120" + }, + "DBD::Gofer::Transport::corostream" : { + "file" : "DBD/Gofer/Transport/corostream.pm" + }, + "DBD::Gofer::Transport::null" : { + "file" : "DBD/Gofer/Transport/null.pm", + "version" : "0.010087" + }, + "DBD::Gofer::Transport::pipeone" : { + "file" : "DBD/Gofer/Transport/pipeone.pm", + "version" : "0.010087" + }, + "DBD::Gofer::Transport::stream" : { + "file" : "DBD/Gofer/Transport/stream.pm", + "version" : "0.014598" + }, + "DBD::Gofer::db" : { + "file" : "DBD/Gofer.pm" + }, + "DBD::Gofer::dr" : { + "file" : "DBD/Gofer.pm" + }, + "DBD::Gofer::st" : { + "file" : "DBD/Gofer.pm" + }, + "DBD::NullP" : { + "file" : "DBD/NullP.pm", + "version" : "12.014563" + }, + "DBD::NullP::db" : { + "file" : "DBD/NullP.pm" + }, + "DBD::NullP::dr" : { + "file" : "DBD/NullP.pm" + }, + "DBD::NullP::st" : { + "file" : "DBD/NullP.pm" + }, + "DBD::Proxy" : { + "file" : "DBD/Proxy.pm", + "version" : "0.2004" + }, + "DBD::Proxy::RPC::PlClient" : { + "file" : "DBD/Proxy.pm" + }, + "DBD::Proxy::db" : { + "file" : "DBD/Proxy.pm" + }, + "DBD::Proxy::dr" : { + "file" : "DBD/Proxy.pm" + }, + "DBD::Proxy::st" : { + "file" : "DBD/Proxy.pm" + }, + "DBD::Sponge" : { + "file" : "DBD/Sponge.pm", + "version" : "12.010002" + }, + "DBD::Sponge::db" : { + "file" : "DBD/Sponge.pm" + }, + "DBD::Sponge::dr" : { + "file" : "DBD/Sponge.pm" + }, + "DBD::Sponge::st" : { + "file" : "DBD/Sponge.pm" + }, + "DBDI" : { + "file" : "DBI/DBD.pm" + }, + "DBI" : { + "file" : "DBI.pm", + "version" : "1.616" + }, + "DBI::Const::GetInfo::ANSI" : { + "file" : "DBI/Const/GetInfo/ANSI.pm", + "version" : "2.008696" + }, + "DBI::Const::GetInfo::ODBC" : { + "file" : "DBI/Const/GetInfo/ODBC.pm", + "version" : "2.011373" + }, + "DBI::Const::GetInfoReturn" : { + "file" : "DBI/Const/GetInfoReturn.pm", + "version" : "2.008696" + }, + "DBI::Const::GetInfoType" : { + "file" : "DBI/Const/GetInfoType.pm", + "version" : "2.008696" + }, + "DBI::DBD" : { + "file" : "DBI/DBD.pm", + "version" : "12.014600" + }, + "DBI::DBD::Metadata" : { + "file" : "DBI/DBD/Metadata.pm", + "version" : "2.014213" + }, + "DBI::DBD::SqlEngine" : { + "file" : "DBI/DBD/SqlEngine.pm", + "version" : "0.03" + }, + "DBI::DBD::SqlEngine::Statement" : { + "file" : "DBI/DBD/SqlEngine.pm" + }, + "DBI::DBD::SqlEngine::Table" : { + "file" : "DBI/DBD/SqlEngine.pm" + }, + "DBI::DBD::SqlEngine::db" : { + "file" : "DBI/DBD/SqlEngine.pm" + }, + "DBI::DBD::SqlEngine::dr" : { + "file" : "DBI/DBD/SqlEngine.pm" + }, + "DBI::DBD::SqlEngine::st" : { + "file" : "DBI/DBD/SqlEngine.pm" + }, + "DBI::FAQ" : { + "file" : "DBI/FAQ.pm", + "version" : "1.014270" + }, + "DBI::Gofer::Execute" : { + "file" : "DBI/Gofer/Execute.pm", + "version" : "0.014282" + }, + "DBI::Gofer::Request" : { + "file" : "DBI/Gofer/Request.pm", + "version" : "0.012536" + }, + "DBI::Gofer::Response" : { + "file" : "DBI/Gofer/Response.pm", + "version" : "0.011565" + }, + "DBI::Gofer::Serializer::Base" : { + "file" : "DBI/Gofer/Serializer/Base.pm", + "version" : "0.009949" + }, + "DBI::Gofer::Serializer::DataDumper" : { + "file" : "DBI/Gofer/Serializer/DataDumper.pm", + "version" : "0.009949" + }, + "DBI::Gofer::Serializer::Storable" : { + "file" : "DBI/Gofer/Serializer/Storable.pm", + "version" : "0.009949" + }, + "DBI::Gofer::Transport::Base" : { + "file" : "DBI/Gofer/Transport/Base.pm", + "version" : "0.012536" + }, + "DBI::Gofer::Transport::pipeone" : { + "file" : "DBI/Gofer/Transport/pipeone.pm", + "version" : "0.012536" + }, + "DBI::Gofer::Transport::stream" : { + "file" : "DBI/Gofer/Transport/stream.pm", + "version" : "0.012536" + }, + "DBI::Profile" : { + "file" : "DBI/Profile.pm", + "version" : "2.014123" + }, + "DBI::ProfileData" : { + "file" : "DBI/ProfileData.pm", + "version" : "2.010007" + }, + "DBI::ProfileDumper" : { + "file" : "DBI/ProfileDumper.pm", + "version" : "2.013956" + }, + "DBI::ProfileDumper::Apache" : { + "file" : "DBI/ProfileDumper/Apache.pm", + "version" : "2.014120" + }, + "DBI::ProfileSubs" : { + "file" : "DBI/ProfileSubs.pm", + "version" : "0.009395" + }, + "DBI::ProxyServer" : { + "file" : "DBI/ProxyServer.pm", + "version" : "0.3005" + }, + "DBI::ProxyServer::db" : { + "file" : "DBI/ProxyServer.pm" + }, + "DBI::ProxyServer::dr" : { + "file" : "DBI/ProxyServer.pm" + }, + "DBI::ProxyServer::st" : { + "file" : "DBI/ProxyServer.pm" + }, + "DBI::PurePerl" : { + "file" : "DBI/PurePerl.pm", + "version" : "2.014285" + }, + "DBI::SQL::Nano" : { + "file" : "DBI/SQL/Nano.pm", + "version" : "1.014600" + }, + "DBI::SQL::Nano::Statement_" : { + "file" : "DBI/SQL/Nano.pm" + }, + "DBI::SQL::Nano::Table_" : { + "file" : "DBI/SQL/Nano.pm" + }, + "DBI::Util::CacheMemory" : { + "file" : "DBI/Util/CacheMemory.pm", + "version" : "0.010314" + }, + "DBI::common" : { + "file" : "DBI.pm" + } + }, + "version" : "1.616" + }, + "DBIx::Class" : { + "dist" : "DBIx-Class-0.08196", + "module" : "DBIx::Class", + "mymeta" : { + "abstract" : "Extensible and flexible object <-> relational mapper.", + "author" : [ + "mst: Matt S. Trout <mst@shadowcatsystems.co.uk>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DBIx-Class", + "no_index" : { + "directory" : [ + "examples", + "inc", + "lib/DBIx/Class/Admin", + "lib/DBIx/Class/CDBICompat", + "lib/DBIx/Class/PK/Auto", + "t", + "xt" + ], + "package" : [ + "DBIx::Class::Storage::DBIHacks", + "DBIx::Class::Carp", + "DBIx::Class::ResultSet::Pager" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "DBD::SQLite" : "1.29", + "ExtUtils::MakeMaker" : "6.42", + "File::Temp" : "0.22", + "Package::Stash" : "0.28", + "Test::Builder" : "0.94", + "Test::Exception" : "0.31", + "Test::More" : "0.94", + "Test::Warn" : "0.21" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Class::Accessor::Grouped" : "0.10002", + "Class::C3::Componentised" : "1.0009", + "Class::Inspector" : "1.24", + "Config::Any" : "0.20", + "Context::Preserve" : "0.01", + "DBD::SQLite" : "1.29", + "DBI" : "1.57", + "Data::Compare" : "1.22", + "Data::Dumper::Concise" : "2.020", + "Data::Page" : "2.00", + "File::Path" : "2.07", + "File::Temp" : "0.22", + "Hash::Merge" : "0.12", + "MRO::Compat" : "0.09", + "Module::Find" : "0.06", + "Package::Stash" : "0.28", + "Path::Class" : "0.18", + "SQL::Abstract" : "1.72", + "Scope::Guard" : "0.03", + "Sub::Name" : "0.04", + "Test::Builder" : "0.94", + "Test::Exception" : "0.31", + "Test::More" : "0.94", + "Test::Warn" : "0.21", + "Try::Tiny" : "0.04", + "namespace::clean" : "0.20", + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=DBIx-Class" + }, + "homepage" : "http://www.dbix-class.org/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git" + }, + "x_IRC" : "irc://irc.perl.org/#dbix-class", + "x_MailingList" : "http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class" + }, + "version" : "0.08196" + }, + "name" : "DBIx::Class", + "pathname" : "A/AR/ARODLAND/DBIx-Class-0.08196.tar.gz", + "provides" : { + "DBIx::Class" : { + "file" : "DBIx/Class.pm", + "version" : "0.08196" + }, + "DBIx::Class::AccessorGroup" : { + "file" : "DBIx/Class/AccessorGroup.pm" + }, + "DBIx::Class::Admin" : { + "file" : "DBIx/Class/Admin.pm" + }, + "DBIx::Class::CDBICompat" : { + "file" : "DBIx/Class/CDBICompat.pm" + }, + "DBIx::Class::CDBICompat::Iterator" : { + "file" : "DBIx/Class/CDBICompat/Iterator.pm" + }, + "DBIx::Class::CDBICompat::Iterator::ResultSet" : { + "file" : "DBIx/Class/CDBICompat/Iterator.pm" + }, + "DBIx::Class::CDBICompat::SQLTransformer" : { + "file" : "DBIx/Class/CDBICompat/SQLTransformer.pm" + }, + "DBIx::Class::CDBICompat::Tied::ColumnValue" : { + "file" : "DBIx/Class/CDBICompat/ColumnsAsHash.pm" + }, + "DBIx::Class::Carp" : { + "file" : "DBIx/Class/Carp.pm" + }, + "DBIx::Class::Core" : { + "file" : "DBIx/Class/Core.pm" + }, + "DBIx::Class::Cursor" : { + "file" : "DBIx/Class/Cursor.pm" + }, + "DBIx::Class::DB" : { + "file" : "DBIx/Class/DB.pm" + }, + "DBIx::Class::Exception" : { + "file" : "DBIx/Class/Exception.pm" + }, + "DBIx::Class::FilterColumn" : { + "file" : "DBIx/Class/FilterColumn.pm" + }, + "DBIx::Class::InflateColumn" : { + "file" : "DBIx/Class/InflateColumn.pm" + }, + "DBIx::Class::InflateColumn::DateTime" : { + "file" : "DBIx/Class/InflateColumn/DateTime.pm" + }, + "DBIx::Class::InflateColumn::File" : { + "file" : "DBIx/Class/InflateColumn/File.pm" + }, + "DBIx::Class::Optional::Dependencies" : { + "file" : "DBIx/Class/Optional/Dependencies.pm" + }, + "DBIx::Class::Ordered" : { + "file" : "DBIx/Class/Ordered.pm" + }, + "DBIx::Class::PK" : { + "file" : "DBIx/Class/PK.pm" + }, + "DBIx::Class::PK::Auto" : { + "file" : "DBIx/Class/PK/Auto.pm" + }, + "DBIx::Class::Relationship" : { + "file" : "DBIx/Class/Relationship.pm" + }, + "DBIx::Class::Relationship::Base" : { + "file" : "DBIx/Class/Relationship/Base.pm" + }, + "DBIx::Class::ResultClass::HashRefInflator" : { + "file" : "DBIx/Class/ResultClass/HashRefInflator.pm" + }, + "DBIx::Class::ResultSet" : { + "file" : "DBIx/Class/ResultSet.pm" + }, + "DBIx::Class::ResultSetColumn" : { + "file" : "DBIx/Class/ResultSetColumn.pm" + }, + "DBIx::Class::ResultSetManager" : { + "file" : "DBIx/Class/ResultSetManager.pm" + }, + "DBIx::Class::ResultSource" : { + "file" : "DBIx/Class/ResultSource.pm" + }, + "DBIx::Class::ResultSource::Table" : { + "file" : "DBIx/Class/ResultSource/Table.pm" + }, + "DBIx::Class::ResultSource::View" : { + "file" : "DBIx/Class/ResultSource/View.pm" + }, + "DBIx::Class::ResultSourceHandle" : { + "file" : "DBIx/Class/ResultSourceHandle.pm" + }, + "DBIx::Class::ResultSourceProxy::Table" : { + "file" : "DBIx/Class/ResultSourceProxy/Table.pm" + }, + "DBIx::Class::Row" : { + "file" : "DBIx/Class/Row.pm" + }, + "DBIx::Class::SQLMaker" : { + "file" : "DBIx/Class/SQLMaker.pm" + }, + "DBIx::Class::SQLMaker::LimitDialects" : { + "file" : "DBIx/Class/SQLMaker/LimitDialects.pm" + }, + "DBIx::Class::SQLMaker::OracleJoins" : { + "file" : "DBIx/Class/SQLMaker/OracleJoins.pm" + }, + "DBIx::Class::Schema" : { + "file" : "DBIx/Class/Schema.pm" + }, + "DBIx::Class::Schema::Versioned" : { + "file" : "DBIx/Class/Schema/Versioned.pm" + }, + "DBIx::Class::Serialize::Storable" : { + "file" : "DBIx/Class/Serialize/Storable.pm" + }, + "DBIx::Class::StartupCheck" : { + "file" : "DBIx/Class/StartupCheck.pm" + }, + "DBIx::Class::Storage" : { + "file" : "DBIx/Class/Storage.pm" + }, + "DBIx::Class::Storage::DBI" : { + "file" : "DBIx/Class/Storage/DBI.pm" + }, + "DBIx::Class::Storage::DBI::ACCESS" : { + "file" : "DBIx/Class/Storage/DBI/ACCESS.pm" + }, + "DBIx::Class::Storage::DBI::ADO" : { + "file" : "DBIx/Class/Storage/DBI/ADO.pm" + }, + "DBIx::Class::Storage::DBI::ADO::MS_Jet" : { + "file" : "DBIx/Class/Storage/DBI/ADO/MS_Jet.pm" + }, + "DBIx::Class::Storage::DBI::ADO::MS_Jet::Cursor" : { + "file" : "DBIx/Class/Storage/DBI/ADO/MS_Jet/Cursor.pm" + }, + "DBIx::Class::Storage::DBI::ADO::Microsoft_SQL_Server" : { + "file" : "DBIx/Class/Storage/DBI/ADO/Microsoft_SQL_Server.pm" + }, + "DBIx::Class::Storage::DBI::AutoCast" : { + "file" : "DBIx/Class/Storage/DBI/AutoCast.pm" + }, + "DBIx::Class::Storage::DBI::Cursor" : { + "file" : "DBIx/Class/Storage/DBI/Cursor.pm" + }, + "DBIx::Class::Storage::DBI::DB2" : { + "file" : "DBIx/Class/Storage/DBI/DB2.pm" + }, + "DBIx::Class::Storage::DBI::Firebird" : { + "file" : "DBIx/Class/Storage/DBI/Firebird.pm" + }, + "DBIx::Class::Storage::DBI::Firebird::Common" : { + "file" : "DBIx/Class/Storage/DBI/Firebird/Common.pm" + }, + "DBIx::Class::Storage::DBI::Informix" : { + "file" : "DBIx/Class/Storage/DBI/Informix.pm" + }, + "DBIx::Class::Storage::DBI::InterBase" : { + "file" : "DBIx/Class/Storage/DBI/InterBase.pm" + }, + "DBIx::Class::Storage::DBI::MSSQL" : { + "file" : "DBIx/Class/Storage/DBI/MSSQL.pm" + }, + "DBIx::Class::Storage::DBI::MultiColumnIn" : { + "file" : "DBIx/Class/Storage/DBI/MultiColumnIn.pm" + }, + "DBIx::Class::Storage::DBI::NoBindVars" : { + "file" : "DBIx/Class/Storage/DBI/NoBindVars.pm" + }, + "DBIx::Class::Storage::DBI::ODBC" : { + "file" : "DBIx/Class/Storage/DBI/ODBC.pm" + }, + "DBIx::Class::Storage::DBI::ODBC::ACCESS" : { + "file" : "DBIx/Class/Storage/DBI/ODBC/ACCESS.pm" + }, + "DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL" : { + "file" : "DBIx/Class/Storage/DBI/ODBC/DB2_400_SQL.pm" + }, + "DBIx::Class::Storage::DBI::ODBC::Firebird" : { + "file" : "DBIx/Class/Storage/DBI/ODBC/Firebird.pm" + }, + "DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server" : { + "file" : "DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm" + }, + "DBIx::Class::Storage::DBI::ODBC::SQL_Anywhere" : { + "file" : "DBIx/Class/Storage/DBI/ODBC/SQL_Anywhere.pm" + }, + "DBIx::Class::Storage::DBI::Oracle" : { + "file" : "DBIx/Class/Storage/DBI/Oracle.pm" + }, + "DBIx::Class::Storage::DBI::Oracle::Generic" : { + "file" : "DBIx/Class/Storage/DBI/Oracle/Generic.pm" + }, + "DBIx::Class::Storage::DBI::Oracle::WhereJoins" : { + "file" : "DBIx/Class/Storage/DBI/Oracle/WhereJoins.pm" + }, + "DBIx::Class::Storage::DBI::Pg" : { + "file" : "DBIx/Class/Storage/DBI/Pg.pm" + }, + "DBIx::Class::Storage::DBI::Replicated" : { + "file" : "DBIx/Class/Storage/DBI/Replicated.pm" + }, + "DBIx::Class::Storage::DBI::Replicated::Balancer" : { + "file" : "DBIx/Class/Storage/DBI/Replicated/Balancer.pm" + }, + "DBIx::Class::Storage::DBI::Replicated::Balancer::First" : { + "file" : "DBIx/Class/Storage/DBI/Replicated/Balancer/First.pm" + }, + "DBIx::Class::Storage::DBI::Replicated::Balancer::Random" : { + "file" : "DBIx/Class/Storage/DBI/Replicated/Balancer/Random.pm" + }, + "DBIx::Class::Storage::DBI::Replicated::Pool" : { + "file" : "DBIx/Class/Storage/DBI/Replicated/Pool.pm" + }, + "DBIx::Class::Storage::DBI::Replicated::Replicant" : { + "file" : "DBIx/Class/Storage/DBI/Replicated/Replicant.pm" + }, + "DBIx::Class::Storage::DBI::Replicated::WithDSN" : { + "file" : "DBIx/Class/Storage/DBI/Replicated/WithDSN.pm" + }, + "DBIx::Class::Storage::DBI::SQLAnywhere" : { + "file" : "DBIx/Class/Storage/DBI/SQLAnywhere.pm" + }, + "DBIx::Class::Storage::DBI::SQLAnywhere::Cursor" : { + "file" : "DBIx/Class/Storage/DBI/SQLAnywhere/Cursor.pm" + }, + "DBIx::Class::Storage::DBI::SQLite" : { + "file" : "DBIx/Class/Storage/DBI/SQLite.pm" + }, + "DBIx::Class::Storage::DBI::Sybase" : { + "file" : "DBIx/Class/Storage/DBI/Sybase.pm" + }, + "DBIx::Class::Storage::DBI::Sybase::ASE" : { + "file" : "DBIx/Class/Storage/DBI/Sybase/ASE.pm" + }, + "DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars" : { + "file" : "DBIx/Class/Storage/DBI/Sybase/ASE/NoBindVars.pm" + }, + "DBIx::Class::Storage::DBI::Sybase::FreeTDS" : { + "file" : "DBIx/Class/Storage/DBI/Sybase/FreeTDS.pm" + }, + "DBIx::Class::Storage::DBI::Sybase::MSSQL" : { + "file" : "DBIx/Class/Storage/DBI/Sybase/MSSQL.pm" + }, + "DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server" : { + "file" : "DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm" + }, + "DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server::NoBindVars" : { + "file" : "DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server/NoBindVars.pm" + }, + "DBIx::Class::Storage::DBI::UniqueIdentifier" : { + "file" : "DBIx/Class/Storage/DBI/UniqueIdentifier.pm" + }, + "DBIx::Class::Storage::DBI::mysql" : { + "file" : "DBIx/Class/Storage/DBI/mysql.pm" + }, + "DBIx::Class::Storage::Statistics" : { + "file" : "DBIx/Class/Storage/Statistics.pm" + }, + "DBIx::Class::Storage::TxnScopeGuard" : { + "file" : "DBIx/Class/Storage/TxnScopeGuard.pm" + }, + "DBIx::Class::UTF8Columns" : { + "file" : "DBIx/Class/UTF8Columns.pm" + }, + "SQL::Translator::Parser::DBIx::Class" : { + "file" : "SQL/Translator/Parser/DBIx/Class.pm", + "version" : "1.10" + }, + "SQL::Translator::Producer::DBIx::Class::File" : { + "file" : "SQL/Translator/Producer/DBIx/Class/File.pm", + "version" : "0.1" + } + }, + "version" : "0.08196" + }, + "DBIx::Class::EncodedColumn" : { + "dist" : "DBIx-Class-EncodedColumn-0.00011", + "module" : "DBIx::Class::EncodedColumn", + "mymeta" : { + "abstract" : "Automatically encode column values", + "author" : [ + "Guillermo Roditi (groditi) <groditi@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DBIx-Class-EncodedColumn", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "DBD::SQLite" : 0, + "Dir::Self" : 0, + "ExtUtils::MakeMaker" : "6.42", + "File::Spec" : 0, + "File::Temp" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "DBD::SQLite" : 0, + "DBIx::Class" : "0.06002", + "Dir::Self" : 0, + "File::Spec" : 0, + "File::Temp" : 0, + "Sub::Name" : "0.04", + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/wreis/DBIx-Class-EncodedColumn.git" + } + }, + "version" : "0.00011" + }, + "name" : "DBIx::Class::EncodedColumn", + "pathname" : "W/WR/WREIS/DBIx-Class-EncodedColumn-0.00011.tar.gz", + "provides" : { + "DBIx::Class::EncodedColumn" : { + "file" : "DBIx/Class/EncodedColumn.pm", + "version" : "0.00011" + }, + "DBIx::Class::EncodedColumn::Crypt" : { + "file" : "DBIx/Class/EncodedColumn/Crypt.pm", + "version" : "0.01" + }, + "DBIx::Class::EncodedColumn::Crypt::Eksblowfish::Bcrypt" : { + "file" : "DBIx/Class/EncodedColumn/Crypt/Eksblowfish/Bcrypt.pm", + "version" : "0.00001" + }, + "DBIx::Class::EncodedColumn::Crypt::OpenPGP" : { + "file" : "DBIx/Class/EncodedColumn/Crypt/OpenPGP.pm", + "version" : "0.01" + }, + "DBIx::Class::EncodedColumn::Digest" : { + "file" : "DBIx/Class/EncodedColumn/Digest.pm", + "version" : "0.00001" + } + }, + "version" : "0.00011" + }, + "Data::Compare" : { + "dist" : "Data-Compare-1.22", + "module" : "Data::Compare", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-Compare", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "File::Find::Rule" : "0.1", + "Scalar::Util" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.22" + }, + "name" : "Data::Compare", + "pathname" : "D/DC/DCANTRELL/Data-Compare-1.22.tar.gz", + "provides" : { + "Data::Compare" : { + "file" : "Data/Compare.pm", + "version" : "1.22" + }, + "Data::Compare::Plugins::Scalar::Properties" : { + "file" : "Data/Compare/Plugins/Scalar/Properties.pm", + "version" : "1" + } + }, + "version" : "1.22" + }, + "Data::Dump" : { + "dist" : "Data-Dump-1.21", + "module" : "Data::Dump", + "mymeta" : { + "abstract" : "Pretty printing of data structures", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-Dump", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "MIME::Base64" : 0 + }, + "requires" : { + "Symbol" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/data-dump" + } + }, + "version" : "1.21" + }, + "name" : "Data::Dump", + "pathname" : "G/GA/GAAS/Data-Dump-1.21.tar.gz", + "provides" : { + "Data::Dump" : { + "file" : "Data/Dump.pm", + "version" : "1.21" + }, + "Data::Dump::FilterContext" : { + "file" : "Data/Dump/FilterContext.pm" + }, + "Data::Dump::Filtered" : { + "file" : "Data/Dump/Filtered.pm" + }, + "Data::Dump::Trace" : { + "file" : "Data/Dump/Trace.pm", + "version" : "0.02" + }, + "Data::Dump::Trace::Call" : { + "file" : "Data/Dump/Trace.pm" + }, + "Data::Dump::Trace::Wrapper" : { + "file" : "Data/Dump/Trace.pm" + } + }, + "version" : "1.21" + }, + "Data::Dumper::Concise" : { + "dist" : "Data-Dumper-Concise-2.020", + "module" : "Data::Dumper::Concise", + "mymeta" : { + "abstract" : "Less indentation and newlines plus sub deparsing", + "author" : [ + "mst - Matt S. Trout <mst@shadowcat.co.uk>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-Dumper-Concise", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "2.020", + "x_module_name" : "Data::Dumper::Concise" + }, + "name" : "Data::Dumper::Concise", + "pathname" : "F/FR/FREW/Data-Dumper-Concise-2.020.tar.gz", + "provides" : { + "Data::Dumper::Concise" : { + "file" : "Data/Dumper/Concise.pm", + "version" : "2.020" + }, + "Data::Dumper::Concise::Sugar" : { + "file" : "Data/Dumper/Concise/Sugar.pm" + }, + "Devel::Dwarn" : { + "file" : "Devel/Dwarn.pm" + } + }, + "version" : "2.020" + }, + "Data::OptList" : { + "dist" : "Data-OptList-0.107", + "module" : "Data::OptList", + "mymeta" : { + "abstract" : "parse and validate simple name/value option pairs", + "author" : [ + "Ricardo Signes <rjbs@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200006, CPAN::Meta::Converter version 2.110930, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-OptList", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.96" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "List::Util" : 0, + "Params::Util" : 0, + "Sub::Install" : "0.921" + } + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "http://github.com/rjbs/data-optlist", + "repository" : { + "url" : "http://github.com/rjbs/data-optlist" + } + }, + "version" : "0.107", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", + "name" : "@RJBS/CheckPrereqsIndexed", + "version" : "0.002" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@RJBS/@Basic/GatherDir", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@RJBS/@Basic/PruneCruft", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@RJBS/@Basic/ManifestSkip", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@RJBS/@Basic/MetaYAML", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@RJBS/@Basic/License", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@RJBS/@Basic/Readme", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@RJBS/@Basic/ExtraTests", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@RJBS/@Basic/ExecDir", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@RJBS/@Basic/ShareDir", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@RJBS/@Basic/MakeMaker", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@RJBS/@Basic/Manifest", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@RJBS/@Basic/TestRelease", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@RJBS/@Basic/ConfirmRelease", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@RJBS/@Basic/UploadToCPAN", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@RJBS/AutoPrereqs", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@RJBS/Git::NextVersion", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@RJBS/PkgVersion", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@RJBS/MetaConfig", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@RJBS/MetaJSON", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@RJBS/NextRelease", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@RJBS/PodSyntaxTests", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@RJBS/Repository", + "version" : "0.18" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@RJBS/TestMoreWithSubtests", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@RJBS/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::GithubMeta", + "name" : "@RJBS/GithubMeta", + "version" : "0.12" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@RJBS/@Git/Check", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "name" : "@RJBS/@Git/Commit", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@RJBS/@Git/Tag", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "name" : "@RJBS/@Git/Push", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "4.200006" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200006" + } + } + }, + "name" : "Data::OptList", + "pathname" : "R/RJ/RJBS/Data-OptList-0.107.tar.gz", + "provides" : { + "Data::OptList" : { + "file" : "Data/OptList.pm", + "version" : "0.107" + } + }, + "version" : "0.107" + }, + "Data::Page" : { + "dist" : "Data-Page-2.02", + "module" : "Data::Page", + "mymeta" : { + "abstract" : "help when paging through sets of results", + "author" : [ + "Based on code originally by Leo Lapworth, with many changes added by\nby Leon Brocard <acme@astray.com>." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-Page", + "prereqs" : { + "configure" : { + "requires" : { + "Module::Build" : "0.35" + } + }, + "runtime" : { + "requires" : { + "Class::Accessor::Chained::Fast" : 0, + "Test::Exception" : 0, + "Test::More" : 0 + } + } + }, + "provides" : { + "Data::Page" : { + "file" : "lib/Data/Page.pm", + "version" : "2.02" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "2.02" + }, + "name" : "Data::Page", + "pathname" : "L/LB/LBROCARD/Data-Page-2.02.tar.gz", + "provides" : { + "Data::Page" : { + "file" : "Data/Page.pm", + "version" : "2.02" + } + }, + "version" : "2.02" + }, + "Data::UUID" : { + "dist" : "Data-UUID-1.217", + "module" : "Data::UUID", + "mymeta" : { + "abstract" : "Perl extension for generating Globally/Universally", + "author" : [ + "Ricardo Signes <rjbs[at]cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "bsd" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-UUID", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Digest::MD5" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.217" + }, + "name" : "Data::UUID", + "pathname" : "R/RJ/RJBS/Data-UUID-1.217.tar.gz", + "provides" : { + "Data::UUID" : { + "file" : "Data/UUID.pm", + "version" : "1.217" + } + }, + "version" : "1.217" + }, + "Data::Visitor" : { + "dist" : "Data-Visitor-0.27", + "module" : "Data::Visitor", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Data-Visitor", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Moose" : "0.89", + "Task::Weaken" : 0, + "Test::More" : 0, + "Test::use::ok" : 0, + "Tie::ToObject" : "0.01", + "namespace::clean" : "0.08" + } + } + }, + "release_status" : "stable", + "version" : "0.27" + }, + "name" : "Data::Visitor", + "pathname" : "F/FL/FLORA/Data-Visitor-0.27.tar.gz", + "provides" : { + "Data::Visitor" : { + "file" : "Data/Visitor.pm", + "version" : "0.27" + }, + "Data::Visitor::Callback" : { + "file" : "Data/Visitor/Callback.pm" + } + }, + "version" : "0.27" + }, + "DateTime" : { + "dist" : "DateTime-0.70", + "module" : "DateTime", + "mymeta" : { + "abstract" : "A date and time object", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::CBuilder" : 0, + "Module::Build" : "0.3601", + "Test::Exception" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.3601" + } + }, + "runtime" : { + "requires" : { + "DateTime::Locale" : "0.41", + "DateTime::TimeZone" : "1.09", + "Math::Round" : 0, + "Params::Validate" : "0.76", + "Scalar::Util" : 0, + "Time::Local" : "1.04", + "perl" : "v5.8.1" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=DateTime" + }, + "repository" : { + "url" : "http://hg.urth.org/hg/DateTime.pm" + } + }, + "version" : "0.70" + }, + "name" : "DateTime", + "pathname" : "D/DR/DROLSKY/DateTime-0.70.tar.gz", + "provides" : { + "DateTime" : { + "file" : "DateTime.pm", + "version" : "0.70" + }, + "DateTime::Duration" : { + "file" : "DateTime/Duration.pm", + "version" : "0.70" + }, + "DateTime::Helpers" : { + "file" : "DateTime/Helpers.pm", + "version" : "0.70" + }, + "DateTime::Infinite" : { + "file" : "DateTime/Infinite.pm", + "version" : "0.70" + }, + "DateTime::Infinite::Future" : { + "file" : "DateTime/Infinite.pm", + "version" : "0.70" + }, + "DateTime::Infinite::Past" : { + "file" : "DateTime/Infinite.pm", + "version" : "0.70" + }, + "DateTime::LeapSecond" : { + "file" : "DateTime/LeapSecond.pm", + "version" : "0.70" + } + }, + "version" : "0.70" + }, + "DateTime::Format::Builder" : { + "dist" : "DateTime-Format-Builder-0.80", + "module" : "DateTime::Format::Builder", + "mymeta" : { + "abstract" : "Create DateTime parser classes and objects.", + "author" : [ + "Originally written by Iain Truskett <spoon@cpan.org>, who died on\nDecember 29, 2003.", + "Maintained by Dave Rolsky <autarch@urth.org>." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-Builder", + "prereqs" : { + "build" : { + "requires" : { + "Module::Build" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "Class::Factory::Util" : "1.6", + "DateTime" : "0.12", + "DateTime::Format::Strptime" : "1.04", + "Params::Validate" : "0.72", + "Task::Weaken" : 0 + } + } + }, + "provides" : { + "DateTime::Format::Builder" : { + "file" : "lib/DateTime/Format/Builder.pm", + "version" : "0.80" + }, + "DateTime::Format::Builder::Parser" : { + "file" : "lib/DateTime/Format/Builder/Parser.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::Dispatch" : { + "file" : "lib/DateTime/Format/Builder/Parser/Dispatch.pm", + "version" : "0.78" + }, + "DateTime::Format::Builder::Parser::Quick" : { + "file" : "lib/DateTime/Format/Builder/Parser/Quick.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::Regex" : { + "file" : "lib/DateTime/Format/Builder/Parser/Regex.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::Strptime" : { + "file" : "lib/DateTime/Format/Builder/Parser/Strptime.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::generic" : { + "file" : "lib/DateTime/Format/Builder/Parser/generic.pm", + "version" : "0.77" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.80" + }, + "name" : "DateTime::Format::Builder", + "pathname" : "D/DR/DROLSKY/DateTime-Format-Builder-0.80.tar.gz", + "provides" : { + "DateTime::Format::Builder" : { + "file" : "DateTime/Format/Builder.pm", + "version" : "0.80" + }, + "DateTime::Format::Builder::Parser" : { + "file" : "DateTime/Format/Builder/Parser.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::Dispatch" : { + "file" : "DateTime/Format/Builder/Parser/Dispatch.pm", + "version" : "0.78" + }, + "DateTime::Format::Builder::Parser::Quick" : { + "file" : "DateTime/Format/Builder/Parser/Quick.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::Regex" : { + "file" : "DateTime/Format/Builder/Parser/Regex.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::Strptime" : { + "file" : "DateTime/Format/Builder/Parser/Strptime.pm", + "version" : "0.77" + }, + "DateTime::Format::Builder::Parser::generic" : { + "file" : "DateTime/Format/Builder/Parser/generic.pm", + "version" : "0.77" + } + }, + "version" : "0.80" + }, + "DateTime::Format::HTTP" : { + "dist" : "DateTime-Format-HTTP-0.40", + "module" : "DateTime::Format::HTTP", + "mymeta" : { + "abstract" : "Date conversion routines", + "author" : [ + "Christiaan Kras <ckras@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-HTTP", + "prereqs" : { + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "DateTime" : "0.17", + "HTTP::Date" : "1.44", + "Test::More" : "0.47" + } + } + }, + "provides" : { + "DateTime::Format::HTTP" : { + "file" : "lib/DateTime/Format/HTTP.pm", + "version" : "0.40" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.40" + }, + "name" : "DateTime::Format::HTTP", + "pathname" : "/authors/id/C/CK/CKRAS/DateTime-Format-HTTP-0.40.tar.gz", + "provides" : { + "DateTime::Format::HTTP" : { + "file" : "DateTime/Format/HTTP.pm", + "version" : "0.40" + } + }, + "version" : "0.40" + }, + "DateTime::Format::ISO8601" : { + "dist" : "DateTime-Format-ISO8601-0.07", + "module" : "DateTime::Format::ISO8601", + "mymeta" : { + "abstract" : "Parses ISO8601 formats", + "author" : [ + "Joshua Hoblitt <jhoblitt@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-ISO8601", + "prereqs" : { + "configure" : { + "requires" : { + "Module::Build" : "0.35" + } + }, + "runtime" : { + "recommends" : { + "File::Find::Rule" : "0.24", + "Test::Distribution" : "1.22", + "Test::Pod" : "0.95" + }, + "requires" : { + "DateTime" : "0.18", + "DateTime::Format::Builder" : "0.77" + } + } + }, + "provides" : { + "DateTime::Format::ISO8601" : { + "file" : "lib/DateTime/Format/ISO8601.pm", + "version" : "0.07" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.07" + }, + "name" : "DateTime::Format::ISO8601", + "pathname" : "J/JH/JHOBLITT/DateTime-Format-ISO8601-0.07.tar.gz", + "provides" : { + "DateTime::Format::ISO8601" : { + "file" : "DateTime/Format/ISO8601.pm", + "version" : "0.07" + } + }, + "version" : "0.07" + }, + "DateTime::Format::Mail" : { + "dist" : "DateTime-Format-Mail-0.3001", + "module" : "DateTime::Format::Mail", + "mymeta" : { + "abstract" : "Convert between DateTime and RFC2822/822 formats", + "author" : [ + "Originally written by Iain Truskett <spoon@cpan.org>, who died on\nDecember 29, 2003.", + "Maintained by Dave Rolsky <autarch@urth.org>." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-Mail", + "prereqs" : { + "build" : { + "requires" : { + "Module::Build" : 0 + } + }, + "runtime" : { + "requires" : { + "DateTime" : "0.1705", + "Params::Validate" : "0.67", + "Test::More" : "0.47" + } + } + }, + "provides" : { + "DateTime::Format::Mail" : { + "file" : "lib/DateTime/Format/Mail.pm", + "version" : "0.3001" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.3001" + }, + "name" : "DateTime::Format::Mail", + "pathname" : "D/DR/DROLSKY/DateTime-Format-Mail-0.3001.tar.gz", + "provides" : { + "DateTime::Format::Mail" : { + "file" : "DateTime/Format/Mail.pm", + "version" : "0.3001" + } + }, + "version" : "0.3001" + }, + "DateTime::Format::Pg" : { + "dist" : "DateTime-Format-Pg-0.16007", + "module" : "DateTime::Format::Pg", + "mymeta" : { + "abstract" : "Parse and format PostgreSQL dates and times", + "author" : [ + "Daisuke Maki <daisuke@endeworks.jp>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-Pg", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "DateTime" : "0.10", + "DateTime::Format::Builder" : "0.72", + "DateTime::TimeZone" : "0.05" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/lestrrat/DateTime-Format-Pg.git" + } + }, + "version" : "0.16007" + }, + "name" : "DateTime::Format::Pg", + "pathname" : "D/DM/DMAKI/DateTime-Format-Pg-0.16007.tar.gz", + "provides" : { + "DateTime::Format::Pg" : { + "file" : "DateTime/Format/Pg.pm", + "version" : "0.16007" + } + }, + "version" : "0.16007" + }, + "DateTime::Format::Strptime" : { + "dist" : "DateTime-Format-Strptime-1.5000", + "module" : "DateTime::Format::Strptime", + "mymeta" : { + "abstract" : "Parse and format strp and strf time patterns", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.102342, CPAN::Meta::Converter version 2.101670, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-Strptime", + "prereqs" : { + "build" : { + "requires" : {} + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "DateTime" : "0.4304", + "DateTime::Locale" : "0.45", + "DateTime::TimeZone" : "0.79", + "Params::Validate" : "0.64", + "Test::More" : "0.88" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=DateTime-Format-Strptime" + }, + "repository" : { + "url" : "http://hg.urth.org/hg/DateTime-Format-Strptime" + } + }, + "version" : "1.5000" + }, + "name" : "DateTime::Format::Strptime", + "pathname" : "D/DR/DROLSKY/DateTime-Format-Strptime-1.5000.tar.gz", + "provides" : { + "DateTime::Format::Strptime" : { + "file" : "DateTime/Format/Strptime.pm", + "version" : "1.5000" + } + }, + "version" : "1.5000" + }, + "DateTime::Format::W3CDTF" : { + "dist" : "DateTime-Format-W3CDTF-0.06", + "module" : "DateTime::Format::W3CDTF", + "mymeta" : { + "abstract" : "Parse and format W3CDTF datetime strings", + "author" : [ + "Dave Rolsky <autarch@urth.org>", + "Gregory Todd Williams <gwilliams@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Format-W3CDTF", + "no_index" : { + "directory" : [ + "examples", + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : "0.61" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "DateTime" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=DateTime-Format-W3CDTF" + }, + "homepage" : "http://search.cpan.org/dist/DateTime-Format-W3CDTF/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/kasei/datetime-format-w3cdtf" + } + }, + "version" : "0.06" + }, + "name" : "DateTime::Format::W3CDTF", + "pathname" : "G/GW/GWILLIAMS/DateTime-Format-W3CDTF-0.06.tar.gz", + "provides" : { + "DateTime::Format::W3CDTF" : { + "file" : "DateTime/Format/W3CDTF.pm", + "version" : "0.06" + } + }, + "version" : "0.06" + }, + "DateTime::Locale" : { + "dist" : "DateTime-Locale-0.45", + "module" : "DateTime::Locale", + "mymeta" : { + "abstract" : "Localization support for DateTime.pm", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-Locale", + "prereqs" : { + "build" : { + "requires" : { + "Module::Build" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "List::MoreUtils" : 0, + "Params::Validate" : "0.91", + "perl" : "5.006" + } + } + }, + "provides" : { + "DateTime::Locale" : { + "file" : "lib/DateTime/Locale.pm", + "version" : "0.45" + }, + "DateTime::Locale::Base" : { + "file" : "lib/DateTime/Locale/Base.pm", + "version" : 0 + }, + "DateTime::Locale::Catalog" : { + "file" : "lib/DateTime/Locale/Catalog.pm", + "version" : 0 + }, + "DateTime::Locale::aa" : { + "file" : "lib/DateTime/Locale/aa.pm", + "version" : 0 + }, + "DateTime::Locale::aa_DJ" : { + "file" : "lib/DateTime/Locale/aa_DJ.pm", + "version" : 0 + }, + "DateTime::Locale::aa_ER" : { + "file" : "lib/DateTime/Locale/aa_ER.pm", + "version" : 0 + }, + "DateTime::Locale::aa_ER_SAAHO" : { + "file" : "lib/DateTime/Locale/aa_ER_SAAHO.pm", + "version" : 0 + }, + "DateTime::Locale::aa_ET" : { + "file" : "lib/DateTime/Locale/aa_ET.pm", + "version" : 0 + }, + "DateTime::Locale::af" : { + "file" : "lib/DateTime/Locale/af.pm", + "version" : 0 + }, + "DateTime::Locale::af_NA" : { + "file" : "lib/DateTime/Locale/af_NA.pm", + "version" : 0 + }, + "DateTime::Locale::af_ZA" : { + "file" : "lib/DateTime/Locale/af_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::ak" : { + "file" : "lib/DateTime/Locale/ak.pm", + "version" : 0 + }, + "DateTime::Locale::ak_GH" : { + "file" : "lib/DateTime/Locale/ak_GH.pm", + "version" : 0 + }, + "DateTime::Locale::am" : { + "file" : "lib/DateTime/Locale/am.pm", + "version" : 0 + }, + "DateTime::Locale::am_ET" : { + "file" : "lib/DateTime/Locale/am_ET.pm", + "version" : 0 + }, + "DateTime::Locale::ar" : { + "file" : "lib/DateTime/Locale/ar.pm", + "version" : 0 + }, + "DateTime::Locale::ar_AE" : { + "file" : "lib/DateTime/Locale/ar_AE.pm", + "version" : 0 + }, + "DateTime::Locale::ar_BH" : { + "file" : "lib/DateTime/Locale/ar_BH.pm", + "version" : 0 + }, + "DateTime::Locale::ar_DZ" : { + "file" : "lib/DateTime/Locale/ar_DZ.pm", + "version" : 0 + }, + "DateTime::Locale::ar_EG" : { + "file" : "lib/DateTime/Locale/ar_EG.pm", + "version" : 0 + }, + "DateTime::Locale::ar_IQ" : { + "file" : "lib/DateTime/Locale/ar_IQ.pm", + "version" : 0 + }, + "DateTime::Locale::ar_JO" : { + "file" : "lib/DateTime/Locale/ar_JO.pm", + "version" : 0 + }, + "DateTime::Locale::ar_KW" : { + "file" : "lib/DateTime/Locale/ar_KW.pm", + "version" : 0 + }, + "DateTime::Locale::ar_LB" : { + "file" : "lib/DateTime/Locale/ar_LB.pm", + "version" : 0 + }, + "DateTime::Locale::ar_LY" : { + "file" : "lib/DateTime/Locale/ar_LY.pm", + "version" : 0 + }, + "DateTime::Locale::ar_MA" : { + "file" : "lib/DateTime/Locale/ar_MA.pm", + "version" : 0 + }, + "DateTime::Locale::ar_OM" : { + "file" : "lib/DateTime/Locale/ar_OM.pm", + "version" : 0 + }, + "DateTime::Locale::ar_QA" : { + "file" : "lib/DateTime/Locale/ar_QA.pm", + "version" : 0 + }, + "DateTime::Locale::ar_SA" : { + "file" : "lib/DateTime/Locale/ar_SA.pm", + "version" : 0 + }, + "DateTime::Locale::ar_SD" : { + "file" : "lib/DateTime/Locale/ar_SD.pm", + "version" : 0 + }, + "DateTime::Locale::ar_SY" : { + "file" : "lib/DateTime/Locale/ar_SY.pm", + "version" : 0 + }, + "DateTime::Locale::ar_TN" : { + "file" : "lib/DateTime/Locale/ar_TN.pm", + "version" : 0 + }, + "DateTime::Locale::ar_YE" : { + "file" : "lib/DateTime/Locale/ar_YE.pm", + "version" : 0 + }, + "DateTime::Locale::as" : { + "file" : "lib/DateTime/Locale/as.pm", + "version" : 0 + }, + "DateTime::Locale::as_IN" : { + "file" : "lib/DateTime/Locale/as_IN.pm", + "version" : 0 + }, + "DateTime::Locale::az" : { + "file" : "lib/DateTime/Locale/az.pm", + "version" : 0 + }, + "DateTime::Locale::az_AZ" : { + "file" : "lib/DateTime/Locale/az_AZ.pm", + "version" : 0 + }, + "DateTime::Locale::az_Cyrl" : { + "file" : "lib/DateTime/Locale/az_Cyrl.pm", + "version" : 0 + }, + "DateTime::Locale::az_Cyrl_AZ" : { + "file" : "lib/DateTime/Locale/az_Cyrl_AZ.pm", + "version" : 0 + }, + "DateTime::Locale::az_Latn" : { + "file" : "lib/DateTime/Locale/az_Latn.pm", + "version" : 0 + }, + "DateTime::Locale::az_Latn_AZ" : { + "file" : "lib/DateTime/Locale/az_Latn_AZ.pm", + "version" : 0 + }, + "DateTime::Locale::be" : { + "file" : "lib/DateTime/Locale/be.pm", + "version" : 0 + }, + "DateTime::Locale::be_BY" : { + "file" : "lib/DateTime/Locale/be_BY.pm", + "version" : 0 + }, + "DateTime::Locale::bg" : { + "file" : "lib/DateTime/Locale/bg.pm", + "version" : 0 + }, + "DateTime::Locale::bg_BG" : { + "file" : "lib/DateTime/Locale/bg_BG.pm", + "version" : 0 + }, + "DateTime::Locale::bn" : { + "file" : "lib/DateTime/Locale/bn.pm", + "version" : 0 + }, + "DateTime::Locale::bn_BD" : { + "file" : "lib/DateTime/Locale/bn_BD.pm", + "version" : 0 + }, + "DateTime::Locale::bn_IN" : { + "file" : "lib/DateTime/Locale/bn_IN.pm", + "version" : 0 + }, + "DateTime::Locale::bo" : { + "file" : "lib/DateTime/Locale/bo.pm", + "version" : 0 + }, + "DateTime::Locale::bo_CN" : { + "file" : "lib/DateTime/Locale/bo_CN.pm", + "version" : 0 + }, + "DateTime::Locale::bo_IN" : { + "file" : "lib/DateTime/Locale/bo_IN.pm", + "version" : 0 + }, + "DateTime::Locale::bs" : { + "file" : "lib/DateTime/Locale/bs.pm", + "version" : 0 + }, + "DateTime::Locale::bs_BA" : { + "file" : "lib/DateTime/Locale/bs_BA.pm", + "version" : 0 + }, + "DateTime::Locale::byn" : { + "file" : "lib/DateTime/Locale/byn.pm", + "version" : 0 + }, + "DateTime::Locale::byn_ER" : { + "file" : "lib/DateTime/Locale/byn_ER.pm", + "version" : 0 + }, + "DateTime::Locale::ca" : { + "file" : "lib/DateTime/Locale/ca.pm", + "version" : 0 + }, + "DateTime::Locale::ca_ES" : { + "file" : "lib/DateTime/Locale/ca_ES.pm", + "version" : 0 + }, + "DateTime::Locale::cch" : { + "file" : "lib/DateTime/Locale/cch.pm", + "version" : 0 + }, + "DateTime::Locale::cch_NG" : { + "file" : "lib/DateTime/Locale/cch_NG.pm", + "version" : 0 + }, + "DateTime::Locale::cop" : { + "file" : "lib/DateTime/Locale/cop.pm", + "version" : 0 + }, + "DateTime::Locale::cs" : { + "file" : "lib/DateTime/Locale/cs.pm", + "version" : 0 + }, + "DateTime::Locale::cs_CZ" : { + "file" : "lib/DateTime/Locale/cs_CZ.pm", + "version" : 0 + }, + "DateTime::Locale::cy" : { + "file" : "lib/DateTime/Locale/cy.pm", + "version" : 0 + }, + "DateTime::Locale::cy_GB" : { + "file" : "lib/DateTime/Locale/cy_GB.pm", + "version" : 0 + }, + "DateTime::Locale::da" : { + "file" : "lib/DateTime/Locale/da.pm", + "version" : 0 + }, + "DateTime::Locale::da_DK" : { + "file" : "lib/DateTime/Locale/da_DK.pm", + "version" : 0 + }, + "DateTime::Locale::de" : { + "file" : "lib/DateTime/Locale/de.pm", + "version" : 0 + }, + "DateTime::Locale::de_AT" : { + "file" : "lib/DateTime/Locale/de_AT.pm", + "version" : 0 + }, + "DateTime::Locale::de_BE" : { + "file" : "lib/DateTime/Locale/de_BE.pm", + "version" : 0 + }, + "DateTime::Locale::de_CH" : { + "file" : "lib/DateTime/Locale/de_CH.pm", + "version" : 0 + }, + "DateTime::Locale::de_DE" : { + "file" : "lib/DateTime/Locale/de_DE.pm", + "version" : 0 + }, + "DateTime::Locale::de_LI" : { + "file" : "lib/DateTime/Locale/de_LI.pm", + "version" : 0 + }, + "DateTime::Locale::de_LU" : { + "file" : "lib/DateTime/Locale/de_LU.pm", + "version" : 0 + }, + "DateTime::Locale::dv" : { + "file" : "lib/DateTime/Locale/dv.pm", + "version" : 0 + }, + "DateTime::Locale::dv_MV" : { + "file" : "lib/DateTime/Locale/dv_MV.pm", + "version" : 0 + }, + "DateTime::Locale::dz" : { + "file" : "lib/DateTime/Locale/dz.pm", + "version" : 0 + }, + "DateTime::Locale::dz_BT" : { + "file" : "lib/DateTime/Locale/dz_BT.pm", + "version" : 0 + }, + "DateTime::Locale::ee" : { + "file" : "lib/DateTime/Locale/ee.pm", + "version" : 0 + }, + "DateTime::Locale::ee_GH" : { + "file" : "lib/DateTime/Locale/ee_GH.pm", + "version" : 0 + }, + "DateTime::Locale::ee_TG" : { + "file" : "lib/DateTime/Locale/ee_TG.pm", + "version" : 0 + }, + "DateTime::Locale::el" : { + "file" : "lib/DateTime/Locale/el.pm", + "version" : 0 + }, + "DateTime::Locale::el_CY" : { + "file" : "lib/DateTime/Locale/el_CY.pm", + "version" : 0 + }, + "DateTime::Locale::el_GR" : { + "file" : "lib/DateTime/Locale/el_GR.pm", + "version" : 0 + }, + "DateTime::Locale::el_POLYTON" : { + "file" : "lib/DateTime/Locale/el_POLYTON.pm", + "version" : 0 + }, + "DateTime::Locale::en" : { + "file" : "lib/DateTime/Locale/en.pm", + "version" : 0 + }, + "DateTime::Locale::en_AS" : { + "file" : "lib/DateTime/Locale/en_AS.pm", + "version" : 0 + }, + "DateTime::Locale::en_AU" : { + "file" : "lib/DateTime/Locale/en_AU.pm", + "version" : 0 + }, + "DateTime::Locale::en_BE" : { + "file" : "lib/DateTime/Locale/en_BE.pm", + "version" : 0 + }, + "DateTime::Locale::en_BW" : { + "file" : "lib/DateTime/Locale/en_BW.pm", + "version" : 0 + }, + "DateTime::Locale::en_BZ" : { + "file" : "lib/DateTime/Locale/en_BZ.pm", + "version" : 0 + }, + "DateTime::Locale::en_CA" : { + "file" : "lib/DateTime/Locale/en_CA.pm", + "version" : 0 + }, + "DateTime::Locale::en_Dsrt" : { + "file" : "lib/DateTime/Locale/en_Dsrt.pm", + "version" : 0 + }, + "DateTime::Locale::en_Dsrt_US" : { + "file" : "lib/DateTime/Locale/en_Dsrt_US.pm", + "version" : 0 + }, + "DateTime::Locale::en_GB" : { + "file" : "lib/DateTime/Locale/en_GB.pm", + "version" : 0 + }, + "DateTime::Locale::en_GU" : { + "file" : "lib/DateTime/Locale/en_GU.pm", + "version" : 0 + }, + "DateTime::Locale::en_HK" : { + "file" : "lib/DateTime/Locale/en_HK.pm", + "version" : 0 + }, + "DateTime::Locale::en_IE" : { + "file" : "lib/DateTime/Locale/en_IE.pm", + "version" : 0 + }, + "DateTime::Locale::en_IN" : { + "file" : "lib/DateTime/Locale/en_IN.pm", + "version" : 0 + }, + "DateTime::Locale::en_JM" : { + "file" : "lib/DateTime/Locale/en_JM.pm", + "version" : 0 + }, + "DateTime::Locale::en_MH" : { + "file" : "lib/DateTime/Locale/en_MH.pm", + "version" : 0 + }, + "DateTime::Locale::en_MP" : { + "file" : "lib/DateTime/Locale/en_MP.pm", + "version" : 0 + }, + "DateTime::Locale::en_MT" : { + "file" : "lib/DateTime/Locale/en_MT.pm", + "version" : 0 + }, + "DateTime::Locale::en_NA" : { + "file" : "lib/DateTime/Locale/en_NA.pm", + "version" : 0 + }, + "DateTime::Locale::en_NZ" : { + "file" : "lib/DateTime/Locale/en_NZ.pm", + "version" : 0 + }, + "DateTime::Locale::en_PH" : { + "file" : "lib/DateTime/Locale/en_PH.pm", + "version" : 0 + }, + "DateTime::Locale::en_PK" : { + "file" : "lib/DateTime/Locale/en_PK.pm", + "version" : 0 + }, + "DateTime::Locale::en_SG" : { + "file" : "lib/DateTime/Locale/en_SG.pm", + "version" : 0 + }, + "DateTime::Locale::en_Shaw" : { + "file" : "lib/DateTime/Locale/en_Shaw.pm", + "version" : 0 + }, + "DateTime::Locale::en_TT" : { + "file" : "lib/DateTime/Locale/en_TT.pm", + "version" : 0 + }, + "DateTime::Locale::en_UM" : { + "file" : "lib/DateTime/Locale/en_UM.pm", + "version" : 0 + }, + "DateTime::Locale::en_US" : { + "file" : "lib/DateTime/Locale/en_US.pm", + "version" : 0 + }, + "DateTime::Locale::en_US_POSIX" : { + "file" : "lib/DateTime/Locale/en_US_POSIX.pm", + "version" : 0 + }, + "DateTime::Locale::en_VI" : { + "file" : "lib/DateTime/Locale/en_VI.pm", + "version" : 0 + }, + "DateTime::Locale::en_ZA" : { + "file" : "lib/DateTime/Locale/en_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::en_ZW" : { + "file" : "lib/DateTime/Locale/en_ZW.pm", + "version" : 0 + }, + "DateTime::Locale::eo" : { + "file" : "lib/DateTime/Locale/eo.pm", + "version" : 0 + }, + "DateTime::Locale::es" : { + "file" : "lib/DateTime/Locale/es.pm", + "version" : 0 + }, + "DateTime::Locale::es_AR" : { + "file" : "lib/DateTime/Locale/es_AR.pm", + "version" : 0 + }, + "DateTime::Locale::es_BO" : { + "file" : "lib/DateTime/Locale/es_BO.pm", + "version" : 0 + }, + "DateTime::Locale::es_CL" : { + "file" : "lib/DateTime/Locale/es_CL.pm", + "version" : 0 + }, + "DateTime::Locale::es_CO" : { + "file" : "lib/DateTime/Locale/es_CO.pm", + "version" : 0 + }, + "DateTime::Locale::es_CR" : { + "file" : "lib/DateTime/Locale/es_CR.pm", + "version" : 0 + }, + "DateTime::Locale::es_DO" : { + "file" : "lib/DateTime/Locale/es_DO.pm", + "version" : 0 + }, + "DateTime::Locale::es_EC" : { + "file" : "lib/DateTime/Locale/es_EC.pm", + "version" : 0 + }, + "DateTime::Locale::es_ES" : { + "file" : "lib/DateTime/Locale/es_ES.pm", + "version" : 0 + }, + "DateTime::Locale::es_GT" : { + "file" : "lib/DateTime/Locale/es_GT.pm", + "version" : 0 + }, + "DateTime::Locale::es_HN" : { + "file" : "lib/DateTime/Locale/es_HN.pm", + "version" : 0 + }, + "DateTime::Locale::es_MX" : { + "file" : "lib/DateTime/Locale/es_MX.pm", + "version" : 0 + }, + "DateTime::Locale::es_NI" : { + "file" : "lib/DateTime/Locale/es_NI.pm", + "version" : 0 + }, + "DateTime::Locale::es_PA" : { + "file" : "lib/DateTime/Locale/es_PA.pm", + "version" : 0 + }, + "DateTime::Locale::es_PE" : { + "file" : "lib/DateTime/Locale/es_PE.pm", + "version" : 0 + }, + "DateTime::Locale::es_PR" : { + "file" : "lib/DateTime/Locale/es_PR.pm", + "version" : 0 + }, + "DateTime::Locale::es_PY" : { + "file" : "lib/DateTime/Locale/es_PY.pm", + "version" : 0 + }, + "DateTime::Locale::es_SV" : { + "file" : "lib/DateTime/Locale/es_SV.pm", + "version" : 0 + }, + "DateTime::Locale::es_US" : { + "file" : "lib/DateTime/Locale/es_US.pm", + "version" : 0 + }, + "DateTime::Locale::es_UY" : { + "file" : "lib/DateTime/Locale/es_UY.pm", + "version" : 0 + }, + "DateTime::Locale::es_VE" : { + "file" : "lib/DateTime/Locale/es_VE.pm", + "version" : 0 + }, + "DateTime::Locale::et" : { + "file" : "lib/DateTime/Locale/et.pm", + "version" : 0 + }, + "DateTime::Locale::et_EE" : { + "file" : "lib/DateTime/Locale/et_EE.pm", + "version" : 0 + }, + "DateTime::Locale::eu" : { + "file" : "lib/DateTime/Locale/eu.pm", + "version" : 0 + }, + "DateTime::Locale::eu_ES" : { + "file" : "lib/DateTime/Locale/eu_ES.pm", + "version" : 0 + }, + "DateTime::Locale::fa" : { + "file" : "lib/DateTime/Locale/fa.pm", + "version" : 0 + }, + "DateTime::Locale::fa_AF" : { + "file" : "lib/DateTime/Locale/fa_AF.pm", + "version" : 0 + }, + "DateTime::Locale::fa_IR" : { + "file" : "lib/DateTime/Locale/fa_IR.pm", + "version" : 0 + }, + "DateTime::Locale::fi" : { + "file" : "lib/DateTime/Locale/fi.pm", + "version" : 0 + }, + "DateTime::Locale::fi_FI" : { + "file" : "lib/DateTime/Locale/fi_FI.pm", + "version" : 0 + }, + "DateTime::Locale::fil" : { + "file" : "lib/DateTime/Locale/fil.pm", + "version" : 0 + }, + "DateTime::Locale::fil_PH" : { + "file" : "lib/DateTime/Locale/fil_PH.pm", + "version" : 0 + }, + "DateTime::Locale::fo" : { + "file" : "lib/DateTime/Locale/fo.pm", + "version" : 0 + }, + "DateTime::Locale::fo_FO" : { + "file" : "lib/DateTime/Locale/fo_FO.pm", + "version" : 0 + }, + "DateTime::Locale::fr" : { + "file" : "lib/DateTime/Locale/fr.pm", + "version" : 0 + }, + "DateTime::Locale::fr_BE" : { + "file" : "lib/DateTime/Locale/fr_BE.pm", + "version" : 0 + }, + "DateTime::Locale::fr_CA" : { + "file" : "lib/DateTime/Locale/fr_CA.pm", + "version" : 0 + }, + "DateTime::Locale::fr_CH" : { + "file" : "lib/DateTime/Locale/fr_CH.pm", + "version" : 0 + }, + "DateTime::Locale::fr_FR" : { + "file" : "lib/DateTime/Locale/fr_FR.pm", + "version" : 0 + }, + "DateTime::Locale::fr_LU" : { + "file" : "lib/DateTime/Locale/fr_LU.pm", + "version" : 0 + }, + "DateTime::Locale::fr_MC" : { + "file" : "lib/DateTime/Locale/fr_MC.pm", + "version" : 0 + }, + "DateTime::Locale::fr_SN" : { + "file" : "lib/DateTime/Locale/fr_SN.pm", + "version" : 0 + }, + "DateTime::Locale::fur" : { + "file" : "lib/DateTime/Locale/fur.pm", + "version" : 0 + }, + "DateTime::Locale::fur_IT" : { + "file" : "lib/DateTime/Locale/fur_IT.pm", + "version" : 0 + }, + "DateTime::Locale::ga" : { + "file" : "lib/DateTime/Locale/ga.pm", + "version" : 0 + }, + "DateTime::Locale::ga_IE" : { + "file" : "lib/DateTime/Locale/ga_IE.pm", + "version" : 0 + }, + "DateTime::Locale::gaa" : { + "file" : "lib/DateTime/Locale/gaa.pm", + "version" : 0 + }, + "DateTime::Locale::gaa_GH" : { + "file" : "lib/DateTime/Locale/gaa_GH.pm", + "version" : 0 + }, + "DateTime::Locale::gez" : { + "file" : "lib/DateTime/Locale/gez.pm", + "version" : 0 + }, + "DateTime::Locale::gez_ER" : { + "file" : "lib/DateTime/Locale/gez_ER.pm", + "version" : 0 + }, + "DateTime::Locale::gez_ET" : { + "file" : "lib/DateTime/Locale/gez_ET.pm", + "version" : 0 + }, + "DateTime::Locale::gl" : { + "file" : "lib/DateTime/Locale/gl.pm", + "version" : 0 + }, + "DateTime::Locale::gl_ES" : { + "file" : "lib/DateTime/Locale/gl_ES.pm", + "version" : 0 + }, + "DateTime::Locale::gsw" : { + "file" : "lib/DateTime/Locale/gsw.pm", + "version" : 0 + }, + "DateTime::Locale::gsw_CH" : { + "file" : "lib/DateTime/Locale/gsw_CH.pm", + "version" : 0 + }, + "DateTime::Locale::gu" : { + "file" : "lib/DateTime/Locale/gu.pm", + "version" : 0 + }, + "DateTime::Locale::gu_IN" : { + "file" : "lib/DateTime/Locale/gu_IN.pm", + "version" : 0 + }, + "DateTime::Locale::gv" : { + "file" : "lib/DateTime/Locale/gv.pm", + "version" : 0 + }, + "DateTime::Locale::gv_GB" : { + "file" : "lib/DateTime/Locale/gv_GB.pm", + "version" : 0 + }, + "DateTime::Locale::ha" : { + "file" : "lib/DateTime/Locale/ha.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Arab" : { + "file" : "lib/DateTime/Locale/ha_Arab.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Arab_NG" : { + "file" : "lib/DateTime/Locale/ha_Arab_NG.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Arab_SD" : { + "file" : "lib/DateTime/Locale/ha_Arab_SD.pm", + "version" : 0 + }, + "DateTime::Locale::ha_GH" : { + "file" : "lib/DateTime/Locale/ha_GH.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Latn" : { + "file" : "lib/DateTime/Locale/ha_Latn.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Latn_GH" : { + "file" : "lib/DateTime/Locale/ha_Latn_GH.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Latn_NE" : { + "file" : "lib/DateTime/Locale/ha_Latn_NE.pm", + "version" : 0 + }, + "DateTime::Locale::ha_Latn_NG" : { + "file" : "lib/DateTime/Locale/ha_Latn_NG.pm", + "version" : 0 + }, + "DateTime::Locale::ha_NE" : { + "file" : "lib/DateTime/Locale/ha_NE.pm", + "version" : 0 + }, + "DateTime::Locale::ha_NG" : { + "file" : "lib/DateTime/Locale/ha_NG.pm", + "version" : 0 + }, + "DateTime::Locale::ha_SD" : { + "file" : "lib/DateTime/Locale/ha_SD.pm", + "version" : 0 + }, + "DateTime::Locale::haw" : { + "file" : "lib/DateTime/Locale/haw.pm", + "version" : 0 + }, + "DateTime::Locale::haw_US" : { + "file" : "lib/DateTime/Locale/haw_US.pm", + "version" : 0 + }, + "DateTime::Locale::he" : { + "file" : "lib/DateTime/Locale/he.pm", + "version" : 0 + }, + "DateTime::Locale::he_IL" : { + "file" : "lib/DateTime/Locale/he_IL.pm", + "version" : 0 + }, + "DateTime::Locale::hi" : { + "file" : "lib/DateTime/Locale/hi.pm", + "version" : 0 + }, + "DateTime::Locale::hi_IN" : { + "file" : "lib/DateTime/Locale/hi_IN.pm", + "version" : 0 + }, + "DateTime::Locale::hr" : { + "file" : "lib/DateTime/Locale/hr.pm", + "version" : 0 + }, + "DateTime::Locale::hr_HR" : { + "file" : "lib/DateTime/Locale/hr_HR.pm", + "version" : 0 + }, + "DateTime::Locale::hu" : { + "file" : "lib/DateTime/Locale/hu.pm", + "version" : 0 + }, + "DateTime::Locale::hu_HU" : { + "file" : "lib/DateTime/Locale/hu_HU.pm", + "version" : 0 + }, + "DateTime::Locale::hy" : { + "file" : "lib/DateTime/Locale/hy.pm", + "version" : 0 + }, + "DateTime::Locale::hy_AM" : { + "file" : "lib/DateTime/Locale/hy_AM.pm", + "version" : 0 + }, + "DateTime::Locale::hy_AM_REVISED" : { + "file" : "lib/DateTime/Locale/hy_AM_REVISED.pm", + "version" : 0 + }, + "DateTime::Locale::ia" : { + "file" : "lib/DateTime/Locale/ia.pm", + "version" : 0 + }, + "DateTime::Locale::id" : { + "file" : "lib/DateTime/Locale/id.pm", + "version" : 0 + }, + "DateTime::Locale::id_ID" : { + "file" : "lib/DateTime/Locale/id_ID.pm", + "version" : 0 + }, + "DateTime::Locale::ig" : { + "file" : "lib/DateTime/Locale/ig.pm", + "version" : 0 + }, + "DateTime::Locale::ig_NG" : { + "file" : "lib/DateTime/Locale/ig_NG.pm", + "version" : 0 + }, + "DateTime::Locale::ii" : { + "file" : "lib/DateTime/Locale/ii.pm", + "version" : 0 + }, + "DateTime::Locale::ii_CN" : { + "file" : "lib/DateTime/Locale/ii_CN.pm", + "version" : 0 + }, + "DateTime::Locale::is" : { + "file" : "lib/DateTime/Locale/is.pm", + "version" : 0 + }, + "DateTime::Locale::is_IS" : { + "file" : "lib/DateTime/Locale/is_IS.pm", + "version" : 0 + }, + "DateTime::Locale::it" : { + "file" : "lib/DateTime/Locale/it.pm", + "version" : 0 + }, + "DateTime::Locale::it_CH" : { + "file" : "lib/DateTime/Locale/it_CH.pm", + "version" : 0 + }, + "DateTime::Locale::it_IT" : { + "file" : "lib/DateTime/Locale/it_IT.pm", + "version" : 0 + }, + "DateTime::Locale::iu" : { + "file" : "lib/DateTime/Locale/iu.pm", + "version" : 0 + }, + "DateTime::Locale::ja" : { + "file" : "lib/DateTime/Locale/ja.pm", + "version" : 0 + }, + "DateTime::Locale::ja_JP" : { + "file" : "lib/DateTime/Locale/ja_JP.pm", + "version" : 0 + }, + "DateTime::Locale::ka" : { + "file" : "lib/DateTime/Locale/ka.pm", + "version" : 0 + }, + "DateTime::Locale::ka_GE" : { + "file" : "lib/DateTime/Locale/ka_GE.pm", + "version" : 0 + }, + "DateTime::Locale::kaj" : { + "file" : "lib/DateTime/Locale/kaj.pm", + "version" : 0 + }, + "DateTime::Locale::kaj_NG" : { + "file" : "lib/DateTime/Locale/kaj_NG.pm", + "version" : 0 + }, + "DateTime::Locale::kam" : { + "file" : "lib/DateTime/Locale/kam.pm", + "version" : 0 + }, + "DateTime::Locale::kam_KE" : { + "file" : "lib/DateTime/Locale/kam_KE.pm", + "version" : 0 + }, + "DateTime::Locale::kcg" : { + "file" : "lib/DateTime/Locale/kcg.pm", + "version" : 0 + }, + "DateTime::Locale::kcg_NG" : { + "file" : "lib/DateTime/Locale/kcg_NG.pm", + "version" : 0 + }, + "DateTime::Locale::kfo" : { + "file" : "lib/DateTime/Locale/kfo.pm", + "version" : 0 + }, + "DateTime::Locale::kfo_CI" : { + "file" : "lib/DateTime/Locale/kfo_CI.pm", + "version" : 0 + }, + "DateTime::Locale::kk" : { + "file" : "lib/DateTime/Locale/kk.pm", + "version" : 0 + }, + "DateTime::Locale::kk_Cyrl" : { + "file" : "lib/DateTime/Locale/kk_Cyrl.pm", + "version" : 0 + }, + "DateTime::Locale::kk_Cyrl_KZ" : { + "file" : "lib/DateTime/Locale/kk_Cyrl_KZ.pm", + "version" : 0 + }, + "DateTime::Locale::kk_KZ" : { + "file" : "lib/DateTime/Locale/kk_KZ.pm", + "version" : 0 + }, + "DateTime::Locale::kl" : { + "file" : "lib/DateTime/Locale/kl.pm", + "version" : 0 + }, + "DateTime::Locale::kl_GL" : { + "file" : "lib/DateTime/Locale/kl_GL.pm", + "version" : 0 + }, + "DateTime::Locale::km" : { + "file" : "lib/DateTime/Locale/km.pm", + "version" : 0 + }, + "DateTime::Locale::km_KH" : { + "file" : "lib/DateTime/Locale/km_KH.pm", + "version" : 0 + }, + "DateTime::Locale::kn" : { + "file" : "lib/DateTime/Locale/kn.pm", + "version" : 0 + }, + "DateTime::Locale::kn_IN" : { + "file" : "lib/DateTime/Locale/kn_IN.pm", + "version" : 0 + }, + "DateTime::Locale::ko" : { + "file" : "lib/DateTime/Locale/ko.pm", + "version" : 0 + }, + "DateTime::Locale::ko_KR" : { + "file" : "lib/DateTime/Locale/ko_KR.pm", + "version" : 0 + }, + "DateTime::Locale::kok" : { + "file" : "lib/DateTime/Locale/kok.pm", + "version" : 0 + }, + "DateTime::Locale::kok_IN" : { + "file" : "lib/DateTime/Locale/kok_IN.pm", + "version" : 0 + }, + "DateTime::Locale::kpe" : { + "file" : "lib/DateTime/Locale/kpe.pm", + "version" : 0 + }, + "DateTime::Locale::kpe_GN" : { + "file" : "lib/DateTime/Locale/kpe_GN.pm", + "version" : 0 + }, + "DateTime::Locale::kpe_LR" : { + "file" : "lib/DateTime/Locale/kpe_LR.pm", + "version" : 0 + }, + "DateTime::Locale::ku" : { + "file" : "lib/DateTime/Locale/ku.pm", + "version" : 0 + }, + "DateTime::Locale::ku_Arab" : { + "file" : "lib/DateTime/Locale/ku_Arab.pm", + "version" : 0 + }, + "DateTime::Locale::ku_Arab_IQ" : { + "file" : "lib/DateTime/Locale/ku_Arab_IQ.pm", + "version" : 0 + }, + "DateTime::Locale::ku_Arab_IR" : { + "file" : "lib/DateTime/Locale/ku_Arab_IR.pm", + "version" : 0 + }, + "DateTime::Locale::ku_Arab_SY" : { + "file" : "lib/DateTime/Locale/ku_Arab_SY.pm", + "version" : 0 + }, + "DateTime::Locale::ku_IQ" : { + "file" : "lib/DateTime/Locale/ku_IQ.pm", + "version" : 0 + }, + "DateTime::Locale::ku_IR" : { + "file" : "lib/DateTime/Locale/ku_IR.pm", + "version" : 0 + }, + "DateTime::Locale::ku_Latn" : { + "file" : "lib/DateTime/Locale/ku_Latn.pm", + "version" : 0 + }, + "DateTime::Locale::ku_Latn_TR" : { + "file" : "lib/DateTime/Locale/ku_Latn_TR.pm", + "version" : 0 + }, + "DateTime::Locale::ku_SY" : { + "file" : "lib/DateTime/Locale/ku_SY.pm", + "version" : 0 + }, + "DateTime::Locale::ku_TR" : { + "file" : "lib/DateTime/Locale/ku_TR.pm", + "version" : 0 + }, + "DateTime::Locale::kw" : { + "file" : "lib/DateTime/Locale/kw.pm", + "version" : 0 + }, + "DateTime::Locale::kw_GB" : { + "file" : "lib/DateTime/Locale/kw_GB.pm", + "version" : 0 + }, + "DateTime::Locale::ky" : { + "file" : "lib/DateTime/Locale/ky.pm", + "version" : 0 + }, + "DateTime::Locale::ky_KG" : { + "file" : "lib/DateTime/Locale/ky_KG.pm", + "version" : 0 + }, + "DateTime::Locale::ln" : { + "file" : "lib/DateTime/Locale/ln.pm", + "version" : 0 + }, + "DateTime::Locale::ln_CD" : { + "file" : "lib/DateTime/Locale/ln_CD.pm", + "version" : 0 + }, + "DateTime::Locale::ln_CG" : { + "file" : "lib/DateTime/Locale/ln_CG.pm", + "version" : 0 + }, + "DateTime::Locale::lo" : { + "file" : "lib/DateTime/Locale/lo.pm", + "version" : 0 + }, + "DateTime::Locale::lo_LA" : { + "file" : "lib/DateTime/Locale/lo_LA.pm", + "version" : 0 + }, + "DateTime::Locale::lt" : { + "file" : "lib/DateTime/Locale/lt.pm", + "version" : 0 + }, + "DateTime::Locale::lt_LT" : { + "file" : "lib/DateTime/Locale/lt_LT.pm", + "version" : 0 + }, + "DateTime::Locale::lv" : { + "file" : "lib/DateTime/Locale/lv.pm", + "version" : 0 + }, + "DateTime::Locale::lv_LV" : { + "file" : "lib/DateTime/Locale/lv_LV.pm", + "version" : 0 + }, + "DateTime::Locale::mk" : { + "file" : "lib/DateTime/Locale/mk.pm", + "version" : 0 + }, + "DateTime::Locale::mk_MK" : { + "file" : "lib/DateTime/Locale/mk_MK.pm", + "version" : 0 + }, + "DateTime::Locale::ml" : { + "file" : "lib/DateTime/Locale/ml.pm", + "version" : 0 + }, + "DateTime::Locale::ml_IN" : { + "file" : "lib/DateTime/Locale/ml_IN.pm", + "version" : 0 + }, + "DateTime::Locale::mn" : { + "file" : "lib/DateTime/Locale/mn.pm", + "version" : 0 + }, + "DateTime::Locale::mn_CN" : { + "file" : "lib/DateTime/Locale/mn_CN.pm", + "version" : 0 + }, + "DateTime::Locale::mn_Cyrl" : { + "file" : "lib/DateTime/Locale/mn_Cyrl.pm", + "version" : 0 + }, + "DateTime::Locale::mn_Cyrl_MN" : { + "file" : "lib/DateTime/Locale/mn_Cyrl_MN.pm", + "version" : 0 + }, + "DateTime::Locale::mn_MN" : { + "file" : "lib/DateTime/Locale/mn_MN.pm", + "version" : 0 + }, + "DateTime::Locale::mn_Mong" : { + "file" : "lib/DateTime/Locale/mn_Mong.pm", + "version" : 0 + }, + "DateTime::Locale::mn_Mong_CN" : { + "file" : "lib/DateTime/Locale/mn_Mong_CN.pm", + "version" : 0 + }, + "DateTime::Locale::mo" : { + "file" : "lib/DateTime/Locale/mo.pm", + "version" : 0 + }, + "DateTime::Locale::mr" : { + "file" : "lib/DateTime/Locale/mr.pm", + "version" : 0 + }, + "DateTime::Locale::mr_IN" : { + "file" : "lib/DateTime/Locale/mr_IN.pm", + "version" : 0 + }, + "DateTime::Locale::ms" : { + "file" : "lib/DateTime/Locale/ms.pm", + "version" : 0 + }, + "DateTime::Locale::ms_BN" : { + "file" : "lib/DateTime/Locale/ms_BN.pm", + "version" : 0 + }, + "DateTime::Locale::ms_MY" : { + "file" : "lib/DateTime/Locale/ms_MY.pm", + "version" : 0 + }, + "DateTime::Locale::mt" : { + "file" : "lib/DateTime/Locale/mt.pm", + "version" : 0 + }, + "DateTime::Locale::mt_MT" : { + "file" : "lib/DateTime/Locale/mt_MT.pm", + "version" : 0 + }, + "DateTime::Locale::my" : { + "file" : "lib/DateTime/Locale/my.pm", + "version" : 0 + }, + "DateTime::Locale::my_MM" : { + "file" : "lib/DateTime/Locale/my_MM.pm", + "version" : 0 + }, + "DateTime::Locale::nb" : { + "file" : "lib/DateTime/Locale/nb.pm", + "version" : 0 + }, + "DateTime::Locale::nb_NO" : { + "file" : "lib/DateTime/Locale/nb_NO.pm", + "version" : 0 + }, + "DateTime::Locale::nds" : { + "file" : "lib/DateTime/Locale/nds.pm", + "version" : 0 + }, + "DateTime::Locale::nds_DE" : { + "file" : "lib/DateTime/Locale/nds_DE.pm", + "version" : 0 + }, + "DateTime::Locale::ne" : { + "file" : "lib/DateTime/Locale/ne.pm", + "version" : 0 + }, + "DateTime::Locale::ne_IN" : { + "file" : "lib/DateTime/Locale/ne_IN.pm", + "version" : 0 + }, + "DateTime::Locale::ne_NP" : { + "file" : "lib/DateTime/Locale/ne_NP.pm", + "version" : 0 + }, + "DateTime::Locale::nl" : { + "file" : "lib/DateTime/Locale/nl.pm", + "version" : 0 + }, + "DateTime::Locale::nl_BE" : { + "file" : "lib/DateTime/Locale/nl_BE.pm", + "version" : 0 + }, + "DateTime::Locale::nl_NL" : { + "file" : "lib/DateTime/Locale/nl_NL.pm", + "version" : 0 + }, + "DateTime::Locale::nn" : { + "file" : "lib/DateTime/Locale/nn.pm", + "version" : 0 + }, + "DateTime::Locale::nn_NO" : { + "file" : "lib/DateTime/Locale/nn_NO.pm", + "version" : 0 + }, + "DateTime::Locale::no" : { + "file" : "lib/DateTime/Locale/no.pm", + "version" : 0 + }, + "DateTime::Locale::nr" : { + "file" : "lib/DateTime/Locale/nr.pm", + "version" : 0 + }, + "DateTime::Locale::nr_ZA" : { + "file" : "lib/DateTime/Locale/nr_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::nso" : { + "file" : "lib/DateTime/Locale/nso.pm", + "version" : 0 + }, + "DateTime::Locale::nso_ZA" : { + "file" : "lib/DateTime/Locale/nso_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::ny" : { + "file" : "lib/DateTime/Locale/ny.pm", + "version" : 0 + }, + "DateTime::Locale::ny_MW" : { + "file" : "lib/DateTime/Locale/ny_MW.pm", + "version" : 0 + }, + "DateTime::Locale::oc" : { + "file" : "lib/DateTime/Locale/oc.pm", + "version" : 0 + }, + "DateTime::Locale::oc_FR" : { + "file" : "lib/DateTime/Locale/oc_FR.pm", + "version" : 0 + }, + "DateTime::Locale::om" : { + "file" : "lib/DateTime/Locale/om.pm", + "version" : 0 + }, + "DateTime::Locale::om_ET" : { + "file" : "lib/DateTime/Locale/om_ET.pm", + "version" : 0 + }, + "DateTime::Locale::om_KE" : { + "file" : "lib/DateTime/Locale/om_KE.pm", + "version" : 0 + }, + "DateTime::Locale::or" : { + "file" : "lib/DateTime/Locale/or.pm", + "version" : 0 + }, + "DateTime::Locale::or_IN" : { + "file" : "lib/DateTime/Locale/or_IN.pm", + "version" : 0 + }, + "DateTime::Locale::pa" : { + "file" : "lib/DateTime/Locale/pa.pm", + "version" : 0 + }, + "DateTime::Locale::pa_Arab" : { + "file" : "lib/DateTime/Locale/pa_Arab.pm", + "version" : 0 + }, + "DateTime::Locale::pa_Arab_PK" : { + "file" : "lib/DateTime/Locale/pa_Arab_PK.pm", + "version" : 0 + }, + "DateTime::Locale::pa_Guru" : { + "file" : "lib/DateTime/Locale/pa_Guru.pm", + "version" : 0 + }, + "DateTime::Locale::pa_Guru_IN" : { + "file" : "lib/DateTime/Locale/pa_Guru_IN.pm", + "version" : 0 + }, + "DateTime::Locale::pa_IN" : { + "file" : "lib/DateTime/Locale/pa_IN.pm", + "version" : 0 + }, + "DateTime::Locale::pa_PK" : { + "file" : "lib/DateTime/Locale/pa_PK.pm", + "version" : 0 + }, + "DateTime::Locale::pl" : { + "file" : "lib/DateTime/Locale/pl.pm", + "version" : 0 + }, + "DateTime::Locale::pl_PL" : { + "file" : "lib/DateTime/Locale/pl_PL.pm", + "version" : 0 + }, + "DateTime::Locale::ps" : { + "file" : "lib/DateTime/Locale/ps.pm", + "version" : 0 + }, + "DateTime::Locale::ps_AF" : { + "file" : "lib/DateTime/Locale/ps_AF.pm", + "version" : 0 + }, + "DateTime::Locale::pt" : { + "file" : "lib/DateTime/Locale/pt.pm", + "version" : 0 + }, + "DateTime::Locale::pt_BR" : { + "file" : "lib/DateTime/Locale/pt_BR.pm", + "version" : 0 + }, + "DateTime::Locale::pt_PT" : { + "file" : "lib/DateTime/Locale/pt_PT.pm", + "version" : 0 + }, + "DateTime::Locale::ro" : { + "file" : "lib/DateTime/Locale/ro.pm", + "version" : 0 + }, + "DateTime::Locale::ro_MD" : { + "file" : "lib/DateTime/Locale/ro_MD.pm", + "version" : 0 + }, + "DateTime::Locale::ro_RO" : { + "file" : "lib/DateTime/Locale/ro_RO.pm", + "version" : 0 + }, + "DateTime::Locale::root" : { + "file" : "lib/DateTime/Locale/root.pm", + "version" : 0 + }, + "DateTime::Locale::ru" : { + "file" : "lib/DateTime/Locale/ru.pm", + "version" : 0 + }, + "DateTime::Locale::ru_RU" : { + "file" : "lib/DateTime/Locale/ru_RU.pm", + "version" : 0 + }, + "DateTime::Locale::ru_UA" : { + "file" : "lib/DateTime/Locale/ru_UA.pm", + "version" : 0 + }, + "DateTime::Locale::rw" : { + "file" : "lib/DateTime/Locale/rw.pm", + "version" : 0 + }, + "DateTime::Locale::rw_RW" : { + "file" : "lib/DateTime/Locale/rw_RW.pm", + "version" : 0 + }, + "DateTime::Locale::sa" : { + "file" : "lib/DateTime/Locale/sa.pm", + "version" : 0 + }, + "DateTime::Locale::sa_IN" : { + "file" : "lib/DateTime/Locale/sa_IN.pm", + "version" : 0 + }, + "DateTime::Locale::se" : { + "file" : "lib/DateTime/Locale/se.pm", + "version" : 0 + }, + "DateTime::Locale::se_FI" : { + "file" : "lib/DateTime/Locale/se_FI.pm", + "version" : 0 + }, + "DateTime::Locale::se_NO" : { + "file" : "lib/DateTime/Locale/se_NO.pm", + "version" : 0 + }, + "DateTime::Locale::sh" : { + "file" : "lib/DateTime/Locale/sh.pm", + "version" : 0 + }, + "DateTime::Locale::sh_BA" : { + "file" : "lib/DateTime/Locale/sh_BA.pm", + "version" : 0 + }, + "DateTime::Locale::sh_CS" : { + "file" : "lib/DateTime/Locale/sh_CS.pm", + "version" : 0 + }, + "DateTime::Locale::sh_YU" : { + "file" : "lib/DateTime/Locale/sh_YU.pm", + "version" : 0 + }, + "DateTime::Locale::si" : { + "file" : "lib/DateTime/Locale/si.pm", + "version" : 0 + }, + "DateTime::Locale::si_LK" : { + "file" : "lib/DateTime/Locale/si_LK.pm", + "version" : 0 + }, + "DateTime::Locale::sid" : { + "file" : "lib/DateTime/Locale/sid.pm", + "version" : 0 + }, + "DateTime::Locale::sid_ET" : { + "file" : "lib/DateTime/Locale/sid_ET.pm", + "version" : 0 + }, + "DateTime::Locale::sk" : { + "file" : "lib/DateTime/Locale/sk.pm", + "version" : 0 + }, + "DateTime::Locale::sk_SK" : { + "file" : "lib/DateTime/Locale/sk_SK.pm", + "version" : 0 + }, + "DateTime::Locale::sl" : { + "file" : "lib/DateTime/Locale/sl.pm", + "version" : 0 + }, + "DateTime::Locale::sl_SI" : { + "file" : "lib/DateTime/Locale/sl_SI.pm", + "version" : 0 + }, + "DateTime::Locale::so" : { + "file" : "lib/DateTime/Locale/so.pm", + "version" : 0 + }, + "DateTime::Locale::so_DJ" : { + "file" : "lib/DateTime/Locale/so_DJ.pm", + "version" : 0 + }, + "DateTime::Locale::so_ET" : { + "file" : "lib/DateTime/Locale/so_ET.pm", + "version" : 0 + }, + "DateTime::Locale::so_KE" : { + "file" : "lib/DateTime/Locale/so_KE.pm", + "version" : 0 + }, + "DateTime::Locale::so_SO" : { + "file" : "lib/DateTime/Locale/so_SO.pm", + "version" : 0 + }, + "DateTime::Locale::sq" : { + "file" : "lib/DateTime/Locale/sq.pm", + "version" : 0 + }, + "DateTime::Locale::sq_AL" : { + "file" : "lib/DateTime/Locale/sq_AL.pm", + "version" : 0 + }, + "DateTime::Locale::sr" : { + "file" : "lib/DateTime/Locale/sr.pm", + "version" : 0 + }, + "DateTime::Locale::sr_BA" : { + "file" : "lib/DateTime/Locale/sr_BA.pm", + "version" : 0 + }, + "DateTime::Locale::sr_CS" : { + "file" : "lib/DateTime/Locale/sr_CS.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Cyrl" : { + "file" : "lib/DateTime/Locale/sr_Cyrl.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Cyrl_BA" : { + "file" : "lib/DateTime/Locale/sr_Cyrl_BA.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Cyrl_CS" : { + "file" : "lib/DateTime/Locale/sr_Cyrl_CS.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Cyrl_ME" : { + "file" : "lib/DateTime/Locale/sr_Cyrl_ME.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Cyrl_RS" : { + "file" : "lib/DateTime/Locale/sr_Cyrl_RS.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Cyrl_YU" : { + "file" : "lib/DateTime/Locale/sr_Cyrl_YU.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Latn" : { + "file" : "lib/DateTime/Locale/sr_Latn.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Latn_BA" : { + "file" : "lib/DateTime/Locale/sr_Latn_BA.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Latn_CS" : { + "file" : "lib/DateTime/Locale/sr_Latn_CS.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Latn_ME" : { + "file" : "lib/DateTime/Locale/sr_Latn_ME.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Latn_RS" : { + "file" : "lib/DateTime/Locale/sr_Latn_RS.pm", + "version" : 0 + }, + "DateTime::Locale::sr_Latn_YU" : { + "file" : "lib/DateTime/Locale/sr_Latn_YU.pm", + "version" : 0 + }, + "DateTime::Locale::sr_ME" : { + "file" : "lib/DateTime/Locale/sr_ME.pm", + "version" : 0 + }, + "DateTime::Locale::sr_RS" : { + "file" : "lib/DateTime/Locale/sr_RS.pm", + "version" : 0 + }, + "DateTime::Locale::sr_YU" : { + "file" : "lib/DateTime/Locale/sr_YU.pm", + "version" : 0 + }, + "DateTime::Locale::ss" : { + "file" : "lib/DateTime/Locale/ss.pm", + "version" : 0 + }, + "DateTime::Locale::ss_SZ" : { + "file" : "lib/DateTime/Locale/ss_SZ.pm", + "version" : 0 + }, + "DateTime::Locale::ss_ZA" : { + "file" : "lib/DateTime/Locale/ss_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::st" : { + "file" : "lib/DateTime/Locale/st.pm", + "version" : 0 + }, + "DateTime::Locale::st_LS" : { + "file" : "lib/DateTime/Locale/st_LS.pm", + "version" : 0 + }, + "DateTime::Locale::st_ZA" : { + "file" : "lib/DateTime/Locale/st_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::sv" : { + "file" : "lib/DateTime/Locale/sv.pm", + "version" : 0 + }, + "DateTime::Locale::sv_FI" : { + "file" : "lib/DateTime/Locale/sv_FI.pm", + "version" : 0 + }, + "DateTime::Locale::sv_SE" : { + "file" : "lib/DateTime/Locale/sv_SE.pm", + "version" : 0 + }, + "DateTime::Locale::sw" : { + "file" : "lib/DateTime/Locale/sw.pm", + "version" : 0 + }, + "DateTime::Locale::sw_KE" : { + "file" : "lib/DateTime/Locale/sw_KE.pm", + "version" : 0 + }, + "DateTime::Locale::sw_TZ" : { + "file" : "lib/DateTime/Locale/sw_TZ.pm", + "version" : 0 + }, + "DateTime::Locale::syr" : { + "file" : "lib/DateTime/Locale/syr.pm", + "version" : 0 + }, + "DateTime::Locale::syr_SY" : { + "file" : "lib/DateTime/Locale/syr_SY.pm", + "version" : 0 + }, + "DateTime::Locale::ta" : { + "file" : "lib/DateTime/Locale/ta.pm", + "version" : 0 + }, + "DateTime::Locale::ta_IN" : { + "file" : "lib/DateTime/Locale/ta_IN.pm", + "version" : 0 + }, + "DateTime::Locale::te" : { + "file" : "lib/DateTime/Locale/te.pm", + "version" : 0 + }, + "DateTime::Locale::te_IN" : { + "file" : "lib/DateTime/Locale/te_IN.pm", + "version" : 0 + }, + "DateTime::Locale::tg" : { + "file" : "lib/DateTime/Locale/tg.pm", + "version" : 0 + }, + "DateTime::Locale::tg_Cyrl" : { + "file" : "lib/DateTime/Locale/tg_Cyrl.pm", + "version" : 0 + }, + "DateTime::Locale::tg_Cyrl_TJ" : { + "file" : "lib/DateTime/Locale/tg_Cyrl_TJ.pm", + "version" : 0 + }, + "DateTime::Locale::tg_TJ" : { + "file" : "lib/DateTime/Locale/tg_TJ.pm", + "version" : 0 + }, + "DateTime::Locale::th" : { + "file" : "lib/DateTime/Locale/th.pm", + "version" : 0 + }, + "DateTime::Locale::th_TH" : { + "file" : "lib/DateTime/Locale/th_TH.pm", + "version" : 0 + }, + "DateTime::Locale::ti" : { + "file" : "lib/DateTime/Locale/ti.pm", + "version" : 0 + }, + "DateTime::Locale::ti_ER" : { + "file" : "lib/DateTime/Locale/ti_ER.pm", + "version" : 0 + }, + "DateTime::Locale::ti_ET" : { + "file" : "lib/DateTime/Locale/ti_ET.pm", + "version" : 0 + }, + "DateTime::Locale::tig" : { + "file" : "lib/DateTime/Locale/tig.pm", + "version" : 0 + }, + "DateTime::Locale::tig_ER" : { + "file" : "lib/DateTime/Locale/tig_ER.pm", + "version" : 0 + }, + "DateTime::Locale::tl" : { + "file" : "lib/DateTime/Locale/tl.pm", + "version" : 0 + }, + "DateTime::Locale::tn" : { + "file" : "lib/DateTime/Locale/tn.pm", + "version" : 0 + }, + "DateTime::Locale::tn_ZA" : { + "file" : "lib/DateTime/Locale/tn_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::to" : { + "file" : "lib/DateTime/Locale/to.pm", + "version" : 0 + }, + "DateTime::Locale::to_TO" : { + "file" : "lib/DateTime/Locale/to_TO.pm", + "version" : 0 + }, + "DateTime::Locale::tr" : { + "file" : "lib/DateTime/Locale/tr.pm", + "version" : 0 + }, + "DateTime::Locale::tr_TR" : { + "file" : "lib/DateTime/Locale/tr_TR.pm", + "version" : 0 + }, + "DateTime::Locale::trv" : { + "file" : "lib/DateTime/Locale/trv.pm", + "version" : 0 + }, + "DateTime::Locale::trv_TW" : { + "file" : "lib/DateTime/Locale/trv_TW.pm", + "version" : 0 + }, + "DateTime::Locale::ts" : { + "file" : "lib/DateTime/Locale/ts.pm", + "version" : 0 + }, + "DateTime::Locale::ts_ZA" : { + "file" : "lib/DateTime/Locale/ts_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::tt" : { + "file" : "lib/DateTime/Locale/tt.pm", + "version" : 0 + }, + "DateTime::Locale::tt_RU" : { + "file" : "lib/DateTime/Locale/tt_RU.pm", + "version" : 0 + }, + "DateTime::Locale::ug" : { + "file" : "lib/DateTime/Locale/ug.pm", + "version" : 0 + }, + "DateTime::Locale::ug_Arab" : { + "file" : "lib/DateTime/Locale/ug_Arab.pm", + "version" : 0 + }, + "DateTime::Locale::ug_Arab_CN" : { + "file" : "lib/DateTime/Locale/ug_Arab_CN.pm", + "version" : 0 + }, + "DateTime::Locale::ug_CN" : { + "file" : "lib/DateTime/Locale/ug_CN.pm", + "version" : 0 + }, + "DateTime::Locale::uk" : { + "file" : "lib/DateTime/Locale/uk.pm", + "version" : 0 + }, + "DateTime::Locale::uk_UA" : { + "file" : "lib/DateTime/Locale/uk_UA.pm", + "version" : 0 + }, + "DateTime::Locale::ur" : { + "file" : "lib/DateTime/Locale/ur.pm", + "version" : 0 + }, + "DateTime::Locale::ur_IN" : { + "file" : "lib/DateTime/Locale/ur_IN.pm", + "version" : 0 + }, + "DateTime::Locale::ur_PK" : { + "file" : "lib/DateTime/Locale/ur_PK.pm", + "version" : 0 + }, + "DateTime::Locale::uz" : { + "file" : "lib/DateTime/Locale/uz.pm", + "version" : 0 + }, + "DateTime::Locale::uz_AF" : { + "file" : "lib/DateTime/Locale/uz_AF.pm", + "version" : 0 + }, + "DateTime::Locale::uz_Arab" : { + "file" : "lib/DateTime/Locale/uz_Arab.pm", + "version" : 0 + }, + "DateTime::Locale::uz_Arab_AF" : { + "file" : "lib/DateTime/Locale/uz_Arab_AF.pm", + "version" : 0 + }, + "DateTime::Locale::uz_Cyrl" : { + "file" : "lib/DateTime/Locale/uz_Cyrl.pm", + "version" : 0 + }, + "DateTime::Locale::uz_Cyrl_UZ" : { + "file" : "lib/DateTime/Locale/uz_Cyrl_UZ.pm", + "version" : 0 + }, + "DateTime::Locale::uz_Latn" : { + "file" : "lib/DateTime/Locale/uz_Latn.pm", + "version" : 0 + }, + "DateTime::Locale::uz_Latn_UZ" : { + "file" : "lib/DateTime/Locale/uz_Latn_UZ.pm", + "version" : 0 + }, + "DateTime::Locale::uz_UZ" : { + "file" : "lib/DateTime/Locale/uz_UZ.pm", + "version" : 0 + }, + "DateTime::Locale::ve" : { + "file" : "lib/DateTime/Locale/ve.pm", + "version" : 0 + }, + "DateTime::Locale::ve_ZA" : { + "file" : "lib/DateTime/Locale/ve_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::vi" : { + "file" : "lib/DateTime/Locale/vi.pm", + "version" : 0 + }, + "DateTime::Locale::vi_VN" : { + "file" : "lib/DateTime/Locale/vi_VN.pm", + "version" : 0 + }, + "DateTime::Locale::wal" : { + "file" : "lib/DateTime/Locale/wal.pm", + "version" : 0 + }, + "DateTime::Locale::wal_ET" : { + "file" : "lib/DateTime/Locale/wal_ET.pm", + "version" : 0 + }, + "DateTime::Locale::wo" : { + "file" : "lib/DateTime/Locale/wo.pm", + "version" : 0 + }, + "DateTime::Locale::wo_Latn" : { + "file" : "lib/DateTime/Locale/wo_Latn.pm", + "version" : 0 + }, + "DateTime::Locale::wo_Latn_SN" : { + "file" : "lib/DateTime/Locale/wo_Latn_SN.pm", + "version" : 0 + }, + "DateTime::Locale::wo_SN" : { + "file" : "lib/DateTime/Locale/wo_SN.pm", + "version" : 0 + }, + "DateTime::Locale::xh" : { + "file" : "lib/DateTime/Locale/xh.pm", + "version" : 0 + }, + "DateTime::Locale::xh_ZA" : { + "file" : "lib/DateTime/Locale/xh_ZA.pm", + "version" : 0 + }, + "DateTime::Locale::yo" : { + "file" : "lib/DateTime/Locale/yo.pm", + "version" : 0 + }, + "DateTime::Locale::yo_NG" : { + "file" : "lib/DateTime/Locale/yo_NG.pm", + "version" : 0 + }, + "DateTime::Locale::zh" : { + "file" : "lib/DateTime/Locale/zh.pm", + "version" : 0 + }, + "DateTime::Locale::zh_CN" : { + "file" : "lib/DateTime/Locale/zh_CN.pm", + "version" : 0 + }, + "DateTime::Locale::zh_HK" : { + "file" : "lib/DateTime/Locale/zh_HK.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hans" : { + "file" : "lib/DateTime/Locale/zh_Hans.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hans_CN" : { + "file" : "lib/DateTime/Locale/zh_Hans_CN.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hans_HK" : { + "file" : "lib/DateTime/Locale/zh_Hans_HK.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hans_MO" : { + "file" : "lib/DateTime/Locale/zh_Hans_MO.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hans_SG" : { + "file" : "lib/DateTime/Locale/zh_Hans_SG.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hant" : { + "file" : "lib/DateTime/Locale/zh_Hant.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hant_HK" : { + "file" : "lib/DateTime/Locale/zh_Hant_HK.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hant_MO" : { + "file" : "lib/DateTime/Locale/zh_Hant_MO.pm", + "version" : 0 + }, + "DateTime::Locale::zh_Hant_TW" : { + "file" : "lib/DateTime/Locale/zh_Hant_TW.pm", + "version" : 0 + }, + "DateTime::Locale::zh_MO" : { + "file" : "lib/DateTime/Locale/zh_MO.pm", + "version" : 0 + }, + "DateTime::Locale::zh_SG" : { + "file" : "lib/DateTime/Locale/zh_SG.pm", + "version" : 0 + }, + "DateTime::Locale::zh_TW" : { + "file" : "lib/DateTime/Locale/zh_TW.pm", + "version" : 0 + }, + "DateTime::Locale::zu" : { + "file" : "lib/DateTime/Locale/zu.pm", + "version" : 0 + }, + "DateTime::Locale::zu_ZA" : { + "file" : "lib/DateTime/Locale/zu_ZA.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=DateTime-Locale" + }, + "homepage" : "http://datetime.perl.org/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://hg.urth.org/hg/DateTime-Locale" + } + }, + "version" : "0.45" + }, + "name" : "DateTime::Locale", + "pathname" : "D/DR/DROLSKY/DateTime-Locale-0.45.tar.gz", + "provides" : { + "DateTime::Locale" : { + "file" : "DateTime/Locale.pm", + "version" : "0.45" + }, + "DateTime::Locale::Base" : { + "file" : "DateTime/Locale/Base.pm" + }, + "DateTime::Locale::Catalog" : { + "file" : "DateTime/Locale/Catalog.pm" + }, + "DateTime::Locale::aa" : { + "file" : "DateTime/Locale/aa.pm" + }, + "DateTime::Locale::aa_DJ" : { + "file" : "DateTime/Locale/aa_DJ.pm" + }, + "DateTime::Locale::aa_ER" : { + "file" : "DateTime/Locale/aa_ER.pm" + }, + "DateTime::Locale::aa_ER_SAAHO" : { + "file" : "DateTime/Locale/aa_ER_SAAHO.pm" + }, + "DateTime::Locale::aa_ET" : { + "file" : "DateTime/Locale/aa_ET.pm" + }, + "DateTime::Locale::af" : { + "file" : "DateTime/Locale/af.pm" + }, + "DateTime::Locale::af_NA" : { + "file" : "DateTime/Locale/af_NA.pm" + }, + "DateTime::Locale::af_ZA" : { + "file" : "DateTime/Locale/af_ZA.pm" + }, + "DateTime::Locale::ak" : { + "file" : "DateTime/Locale/ak.pm" + }, + "DateTime::Locale::ak_GH" : { + "file" : "DateTime/Locale/ak_GH.pm" + }, + "DateTime::Locale::am" : { + "file" : "DateTime/Locale/am.pm" + }, + "DateTime::Locale::am_ET" : { + "file" : "DateTime/Locale/am_ET.pm" + }, + "DateTime::Locale::ar" : { + "file" : "DateTime/Locale/ar.pm" + }, + "DateTime::Locale::ar_AE" : { + "file" : "DateTime/Locale/ar_AE.pm" + }, + "DateTime::Locale::ar_BH" : { + "file" : "DateTime/Locale/ar_BH.pm" + }, + "DateTime::Locale::ar_DZ" : { + "file" : "DateTime/Locale/ar_DZ.pm" + }, + "DateTime::Locale::ar_EG" : { + "file" : "DateTime/Locale/ar_EG.pm" + }, + "DateTime::Locale::ar_IQ" : { + "file" : "DateTime/Locale/ar_IQ.pm" + }, + "DateTime::Locale::ar_JO" : { + "file" : "DateTime/Locale/ar_JO.pm" + }, + "DateTime::Locale::ar_KW" : { + "file" : "DateTime/Locale/ar_KW.pm" + }, + "DateTime::Locale::ar_LB" : { + "file" : "DateTime/Locale/ar_LB.pm" + }, + "DateTime::Locale::ar_LY" : { + "file" : "DateTime/Locale/ar_LY.pm" + }, + "DateTime::Locale::ar_MA" : { + "file" : "DateTime/Locale/ar_MA.pm" + }, + "DateTime::Locale::ar_OM" : { + "file" : "DateTime/Locale/ar_OM.pm" + }, + "DateTime::Locale::ar_QA" : { + "file" : "DateTime/Locale/ar_QA.pm" + }, + "DateTime::Locale::ar_SA" : { + "file" : "DateTime/Locale/ar_SA.pm" + }, + "DateTime::Locale::ar_SD" : { + "file" : "DateTime/Locale/ar_SD.pm" + }, + "DateTime::Locale::ar_SY" : { + "file" : "DateTime/Locale/ar_SY.pm" + }, + "DateTime::Locale::ar_TN" : { + "file" : "DateTime/Locale/ar_TN.pm" + }, + "DateTime::Locale::ar_YE" : { + "file" : "DateTime/Locale/ar_YE.pm" + }, + "DateTime::Locale::as" : { + "file" : "DateTime/Locale/as.pm" + }, + "DateTime::Locale::as_IN" : { + "file" : "DateTime/Locale/as_IN.pm" + }, + "DateTime::Locale::az" : { + "file" : "DateTime/Locale/az.pm" + }, + "DateTime::Locale::az_AZ" : { + "file" : "DateTime/Locale/az_AZ.pm" + }, + "DateTime::Locale::az_Cyrl" : { + "file" : "DateTime/Locale/az_Cyrl.pm" + }, + "DateTime::Locale::az_Cyrl_AZ" : { + "file" : "DateTime/Locale/az_Cyrl_AZ.pm" + }, + "DateTime::Locale::az_Latn" : { + "file" : "DateTime/Locale/az_Latn.pm" + }, + "DateTime::Locale::az_Latn_AZ" : { + "file" : "DateTime/Locale/az_Latn_AZ.pm" + }, + "DateTime::Locale::be" : { + "file" : "DateTime/Locale/be.pm" + }, + "DateTime::Locale::be_BY" : { + "file" : "DateTime/Locale/be_BY.pm" + }, + "DateTime::Locale::bg" : { + "file" : "DateTime/Locale/bg.pm" + }, + "DateTime::Locale::bg_BG" : { + "file" : "DateTime/Locale/bg_BG.pm" + }, + "DateTime::Locale::bn" : { + "file" : "DateTime/Locale/bn.pm" + }, + "DateTime::Locale::bn_BD" : { + "file" : "DateTime/Locale/bn_BD.pm" + }, + "DateTime::Locale::bn_IN" : { + "file" : "DateTime/Locale/bn_IN.pm" + }, + "DateTime::Locale::bo" : { + "file" : "DateTime/Locale/bo.pm" + }, + "DateTime::Locale::bo_CN" : { + "file" : "DateTime/Locale/bo_CN.pm" + }, + "DateTime::Locale::bo_IN" : { + "file" : "DateTime/Locale/bo_IN.pm" + }, + "DateTime::Locale::bs" : { + "file" : "DateTime/Locale/bs.pm" + }, + "DateTime::Locale::bs_BA" : { + "file" : "DateTime/Locale/bs_BA.pm" + }, + "DateTime::Locale::byn" : { + "file" : "DateTime/Locale/byn.pm" + }, + "DateTime::Locale::byn_ER" : { + "file" : "DateTime/Locale/byn_ER.pm" + }, + "DateTime::Locale::ca" : { + "file" : "DateTime/Locale/ca.pm" + }, + "DateTime::Locale::ca_ES" : { + "file" : "DateTime/Locale/ca_ES.pm" + }, + "DateTime::Locale::cch" : { + "file" : "DateTime/Locale/cch.pm" + }, + "DateTime::Locale::cch_NG" : { + "file" : "DateTime/Locale/cch_NG.pm" + }, + "DateTime::Locale::cop" : { + "file" : "DateTime/Locale/cop.pm" + }, + "DateTime::Locale::cs" : { + "file" : "DateTime/Locale/cs.pm" + }, + "DateTime::Locale::cs_CZ" : { + "file" : "DateTime/Locale/cs_CZ.pm" + }, + "DateTime::Locale::cy" : { + "file" : "DateTime/Locale/cy.pm" + }, + "DateTime::Locale::cy_GB" : { + "file" : "DateTime/Locale/cy_GB.pm" + }, + "DateTime::Locale::da" : { + "file" : "DateTime/Locale/da.pm" + }, + "DateTime::Locale::da_DK" : { + "file" : "DateTime/Locale/da_DK.pm" + }, + "DateTime::Locale::de" : { + "file" : "DateTime/Locale/de.pm" + }, + "DateTime::Locale::de_AT" : { + "file" : "DateTime/Locale/de_AT.pm" + }, + "DateTime::Locale::de_BE" : { + "file" : "DateTime/Locale/de_BE.pm" + }, + "DateTime::Locale::de_CH" : { + "file" : "DateTime/Locale/de_CH.pm" + }, + "DateTime::Locale::de_DE" : { + "file" : "DateTime/Locale/de_DE.pm" + }, + "DateTime::Locale::de_LI" : { + "file" : "DateTime/Locale/de_LI.pm" + }, + "DateTime::Locale::de_LU" : { + "file" : "DateTime/Locale/de_LU.pm" + }, + "DateTime::Locale::dv" : { + "file" : "DateTime/Locale/dv.pm" + }, + "DateTime::Locale::dv_MV" : { + "file" : "DateTime/Locale/dv_MV.pm" + }, + "DateTime::Locale::dz" : { + "file" : "DateTime/Locale/dz.pm" + }, + "DateTime::Locale::dz_BT" : { + "file" : "DateTime/Locale/dz_BT.pm" + }, + "DateTime::Locale::ee" : { + "file" : "DateTime/Locale/ee.pm" + }, + "DateTime::Locale::ee_GH" : { + "file" : "DateTime/Locale/ee_GH.pm" + }, + "DateTime::Locale::ee_TG" : { + "file" : "DateTime/Locale/ee_TG.pm" + }, + "DateTime::Locale::el" : { + "file" : "DateTime/Locale/el.pm" + }, + "DateTime::Locale::el_CY" : { + "file" : "DateTime/Locale/el_CY.pm" + }, + "DateTime::Locale::el_GR" : { + "file" : "DateTime/Locale/el_GR.pm" + }, + "DateTime::Locale::el_POLYTON" : { + "file" : "DateTime/Locale/el_POLYTON.pm" + }, + "DateTime::Locale::en" : { + "file" : "DateTime/Locale/en.pm" + }, + "DateTime::Locale::en_AS" : { + "file" : "DateTime/Locale/en_AS.pm" + }, + "DateTime::Locale::en_AU" : { + "file" : "DateTime/Locale/en_AU.pm" + }, + "DateTime::Locale::en_BE" : { + "file" : "DateTime/Locale/en_BE.pm" + }, + "DateTime::Locale::en_BW" : { + "file" : "DateTime/Locale/en_BW.pm" + }, + "DateTime::Locale::en_BZ" : { + "file" : "DateTime/Locale/en_BZ.pm" + }, + "DateTime::Locale::en_CA" : { + "file" : "DateTime/Locale/en_CA.pm" + }, + "DateTime::Locale::en_Dsrt" : { + "file" : "DateTime/Locale/en_Dsrt.pm" + }, + "DateTime::Locale::en_Dsrt_US" : { + "file" : "DateTime/Locale/en_Dsrt_US.pm" + }, + "DateTime::Locale::en_GB" : { + "file" : "DateTime/Locale/en_GB.pm" + }, + "DateTime::Locale::en_GU" : { + "file" : "DateTime/Locale/en_GU.pm" + }, + "DateTime::Locale::en_HK" : { + "file" : "DateTime/Locale/en_HK.pm" + }, + "DateTime::Locale::en_IE" : { + "file" : "DateTime/Locale/en_IE.pm" + }, + "DateTime::Locale::en_IN" : { + "file" : "DateTime/Locale/en_IN.pm" + }, + "DateTime::Locale::en_JM" : { + "file" : "DateTime/Locale/en_JM.pm" + }, + "DateTime::Locale::en_MH" : { + "file" : "DateTime/Locale/en_MH.pm" + }, + "DateTime::Locale::en_MP" : { + "file" : "DateTime/Locale/en_MP.pm" + }, + "DateTime::Locale::en_MT" : { + "file" : "DateTime/Locale/en_MT.pm" + }, + "DateTime::Locale::en_NA" : { + "file" : "DateTime/Locale/en_NA.pm" + }, + "DateTime::Locale::en_NZ" : { + "file" : "DateTime/Locale/en_NZ.pm" + }, + "DateTime::Locale::en_PH" : { + "file" : "DateTime/Locale/en_PH.pm" + }, + "DateTime::Locale::en_PK" : { + "file" : "DateTime/Locale/en_PK.pm" + }, + "DateTime::Locale::en_SG" : { + "file" : "DateTime/Locale/en_SG.pm" + }, + "DateTime::Locale::en_Shaw" : { + "file" : "DateTime/Locale/en_Shaw.pm" + }, + "DateTime::Locale::en_TT" : { + "file" : "DateTime/Locale/en_TT.pm" + }, + "DateTime::Locale::en_UM" : { + "file" : "DateTime/Locale/en_UM.pm" + }, + "DateTime::Locale::en_US" : { + "file" : "DateTime/Locale/en_US.pm" + }, + "DateTime::Locale::en_US_POSIX" : { + "file" : "DateTime/Locale/en_US_POSIX.pm" + }, + "DateTime::Locale::en_VI" : { + "file" : "DateTime/Locale/en_VI.pm" + }, + "DateTime::Locale::en_ZA" : { + "file" : "DateTime/Locale/en_ZA.pm" + }, + "DateTime::Locale::en_ZW" : { + "file" : "DateTime/Locale/en_ZW.pm" + }, + "DateTime::Locale::eo" : { + "file" : "DateTime/Locale/eo.pm" + }, + "DateTime::Locale::es" : { + "file" : "DateTime/Locale/es.pm" + }, + "DateTime::Locale::es_AR" : { + "file" : "DateTime/Locale/es_AR.pm" + }, + "DateTime::Locale::es_BO" : { + "file" : "DateTime/Locale/es_BO.pm" + }, + "DateTime::Locale::es_CL" : { + "file" : "DateTime/Locale/es_CL.pm" + }, + "DateTime::Locale::es_CO" : { + "file" : "DateTime/Locale/es_CO.pm" + }, + "DateTime::Locale::es_CR" : { + "file" : "DateTime/Locale/es_CR.pm" + }, + "DateTime::Locale::es_DO" : { + "file" : "DateTime/Locale/es_DO.pm" + }, + "DateTime::Locale::es_EC" : { + "file" : "DateTime/Locale/es_EC.pm" + }, + "DateTime::Locale::es_ES" : { + "file" : "DateTime/Locale/es_ES.pm" + }, + "DateTime::Locale::es_GT" : { + "file" : "DateTime/Locale/es_GT.pm" + }, + "DateTime::Locale::es_HN" : { + "file" : "DateTime/Locale/es_HN.pm" + }, + "DateTime::Locale::es_MX" : { + "file" : "DateTime/Locale/es_MX.pm" + }, + "DateTime::Locale::es_NI" : { + "file" : "DateTime/Locale/es_NI.pm" + }, + "DateTime::Locale::es_PA" : { + "file" : "DateTime/Locale/es_PA.pm" + }, + "DateTime::Locale::es_PE" : { + "file" : "DateTime/Locale/es_PE.pm" + }, + "DateTime::Locale::es_PR" : { + "file" : "DateTime/Locale/es_PR.pm" + }, + "DateTime::Locale::es_PY" : { + "file" : "DateTime/Locale/es_PY.pm" + }, + "DateTime::Locale::es_SV" : { + "file" : "DateTime/Locale/es_SV.pm" + }, + "DateTime::Locale::es_US" : { + "file" : "DateTime/Locale/es_US.pm" + }, + "DateTime::Locale::es_UY" : { + "file" : "DateTime/Locale/es_UY.pm" + }, + "DateTime::Locale::es_VE" : { + "file" : "DateTime/Locale/es_VE.pm" + }, + "DateTime::Locale::et" : { + "file" : "DateTime/Locale/et.pm" + }, + "DateTime::Locale::et_EE" : { + "file" : "DateTime/Locale/et_EE.pm" + }, + "DateTime::Locale::eu" : { + "file" : "DateTime/Locale/eu.pm" + }, + "DateTime::Locale::eu_ES" : { + "file" : "DateTime/Locale/eu_ES.pm" + }, + "DateTime::Locale::fa" : { + "file" : "DateTime/Locale/fa.pm" + }, + "DateTime::Locale::fa_AF" : { + "file" : "DateTime/Locale/fa_AF.pm" + }, + "DateTime::Locale::fa_IR" : { + "file" : "DateTime/Locale/fa_IR.pm" + }, + "DateTime::Locale::fi" : { + "file" : "DateTime/Locale/fi.pm" + }, + "DateTime::Locale::fi_FI" : { + "file" : "DateTime/Locale/fi_FI.pm" + }, + "DateTime::Locale::fil" : { + "file" : "DateTime/Locale/fil.pm" + }, + "DateTime::Locale::fil_PH" : { + "file" : "DateTime/Locale/fil_PH.pm" + }, + "DateTime::Locale::fo" : { + "file" : "DateTime/Locale/fo.pm" + }, + "DateTime::Locale::fo_FO" : { + "file" : "DateTime/Locale/fo_FO.pm" + }, + "DateTime::Locale::fr" : { + "file" : "DateTime/Locale/fr.pm" + }, + "DateTime::Locale::fr_BE" : { + "file" : "DateTime/Locale/fr_BE.pm" + }, + "DateTime::Locale::fr_CA" : { + "file" : "DateTime/Locale/fr_CA.pm" + }, + "DateTime::Locale::fr_CH" : { + "file" : "DateTime/Locale/fr_CH.pm" + }, + "DateTime::Locale::fr_FR" : { + "file" : "DateTime/Locale/fr_FR.pm" + }, + "DateTime::Locale::fr_LU" : { + "file" : "DateTime/Locale/fr_LU.pm" + }, + "DateTime::Locale::fr_MC" : { + "file" : "DateTime/Locale/fr_MC.pm" + }, + "DateTime::Locale::fr_SN" : { + "file" : "DateTime/Locale/fr_SN.pm" + }, + "DateTime::Locale::fur" : { + "file" : "DateTime/Locale/fur.pm" + }, + "DateTime::Locale::fur_IT" : { + "file" : "DateTime/Locale/fur_IT.pm" + }, + "DateTime::Locale::ga" : { + "file" : "DateTime/Locale/ga.pm" + }, + "DateTime::Locale::ga_IE" : { + "file" : "DateTime/Locale/ga_IE.pm" + }, + "DateTime::Locale::gaa" : { + "file" : "DateTime/Locale/gaa.pm" + }, + "DateTime::Locale::gaa_GH" : { + "file" : "DateTime/Locale/gaa_GH.pm" + }, + "DateTime::Locale::gez" : { + "file" : "DateTime/Locale/gez.pm" + }, + "DateTime::Locale::gez_ER" : { + "file" : "DateTime/Locale/gez_ER.pm" + }, + "DateTime::Locale::gez_ET" : { + "file" : "DateTime/Locale/gez_ET.pm" + }, + "DateTime::Locale::gl" : { + "file" : "DateTime/Locale/gl.pm" + }, + "DateTime::Locale::gl_ES" : { + "file" : "DateTime/Locale/gl_ES.pm" + }, + "DateTime::Locale::gsw" : { + "file" : "DateTime/Locale/gsw.pm" + }, + "DateTime::Locale::gsw_CH" : { + "file" : "DateTime/Locale/gsw_CH.pm" + }, + "DateTime::Locale::gu" : { + "file" : "DateTime/Locale/gu.pm" + }, + "DateTime::Locale::gu_IN" : { + "file" : "DateTime/Locale/gu_IN.pm" + }, + "DateTime::Locale::gv" : { + "file" : "DateTime/Locale/gv.pm" + }, + "DateTime::Locale::gv_GB" : { + "file" : "DateTime/Locale/gv_GB.pm" + }, + "DateTime::Locale::ha" : { + "file" : "DateTime/Locale/ha.pm" + }, + "DateTime::Locale::ha_Arab" : { + "file" : "DateTime/Locale/ha_Arab.pm" + }, + "DateTime::Locale::ha_Arab_NG" : { + "file" : "DateTime/Locale/ha_Arab_NG.pm" + }, + "DateTime::Locale::ha_Arab_SD" : { + "file" : "DateTime/Locale/ha_Arab_SD.pm" + }, + "DateTime::Locale::ha_GH" : { + "file" : "DateTime/Locale/ha_GH.pm" + }, + "DateTime::Locale::ha_Latn" : { + "file" : "DateTime/Locale/ha_Latn.pm" + }, + "DateTime::Locale::ha_Latn_GH" : { + "file" : "DateTime/Locale/ha_Latn_GH.pm" + }, + "DateTime::Locale::ha_Latn_NE" : { + "file" : "DateTime/Locale/ha_Latn_NE.pm" + }, + "DateTime::Locale::ha_Latn_NG" : { + "file" : "DateTime/Locale/ha_Latn_NG.pm" + }, + "DateTime::Locale::ha_NE" : { + "file" : "DateTime/Locale/ha_NE.pm" + }, + "DateTime::Locale::ha_NG" : { + "file" : "DateTime/Locale/ha_NG.pm" + }, + "DateTime::Locale::ha_SD" : { + "file" : "DateTime/Locale/ha_SD.pm" + }, + "DateTime::Locale::haw" : { + "file" : "DateTime/Locale/haw.pm" + }, + "DateTime::Locale::haw_US" : { + "file" : "DateTime/Locale/haw_US.pm" + }, + "DateTime::Locale::he" : { + "file" : "DateTime/Locale/he.pm" + }, + "DateTime::Locale::he_IL" : { + "file" : "DateTime/Locale/he_IL.pm" + }, + "DateTime::Locale::hi" : { + "file" : "DateTime/Locale/hi.pm" + }, + "DateTime::Locale::hi_IN" : { + "file" : "DateTime/Locale/hi_IN.pm" + }, + "DateTime::Locale::hr" : { + "file" : "DateTime/Locale/hr.pm" + }, + "DateTime::Locale::hr_HR" : { + "file" : "DateTime/Locale/hr_HR.pm" + }, + "DateTime::Locale::hu" : { + "file" : "DateTime/Locale/hu.pm" + }, + "DateTime::Locale::hu_HU" : { + "file" : "DateTime/Locale/hu_HU.pm" + }, + "DateTime::Locale::hy" : { + "file" : "DateTime/Locale/hy.pm" + }, + "DateTime::Locale::hy_AM" : { + "file" : "DateTime/Locale/hy_AM.pm" + }, + "DateTime::Locale::hy_AM_REVISED" : { + "file" : "DateTime/Locale/hy_AM_REVISED.pm" + }, + "DateTime::Locale::ia" : { + "file" : "DateTime/Locale/ia.pm" + }, + "DateTime::Locale::id" : { + "file" : "DateTime/Locale/id.pm" + }, + "DateTime::Locale::id_ID" : { + "file" : "DateTime/Locale/id_ID.pm" + }, + "DateTime::Locale::ig" : { + "file" : "DateTime/Locale/ig.pm" + }, + "DateTime::Locale::ig_NG" : { + "file" : "DateTime/Locale/ig_NG.pm" + }, + "DateTime::Locale::ii" : { + "file" : "DateTime/Locale/ii.pm" + }, + "DateTime::Locale::ii_CN" : { + "file" : "DateTime/Locale/ii_CN.pm" + }, + "DateTime::Locale::is" : { + "file" : "DateTime/Locale/is.pm" + }, + "DateTime::Locale::is_IS" : { + "file" : "DateTime/Locale/is_IS.pm" + }, + "DateTime::Locale::it" : { + "file" : "DateTime/Locale/it.pm" + }, + "DateTime::Locale::it_CH" : { + "file" : "DateTime/Locale/it_CH.pm" + }, + "DateTime::Locale::it_IT" : { + "file" : "DateTime/Locale/it_IT.pm" + }, + "DateTime::Locale::iu" : { + "file" : "DateTime/Locale/iu.pm" + }, + "DateTime::Locale::ja" : { + "file" : "DateTime/Locale/ja.pm" + }, + "DateTime::Locale::ja_JP" : { + "file" : "DateTime/Locale/ja_JP.pm" + }, + "DateTime::Locale::ka" : { + "file" : "DateTime/Locale/ka.pm" + }, + "DateTime::Locale::ka_GE" : { + "file" : "DateTime/Locale/ka_GE.pm" + }, + "DateTime::Locale::kaj" : { + "file" : "DateTime/Locale/kaj.pm" + }, + "DateTime::Locale::kaj_NG" : { + "file" : "DateTime/Locale/kaj_NG.pm" + }, + "DateTime::Locale::kam" : { + "file" : "DateTime/Locale/kam.pm" + }, + "DateTime::Locale::kam_KE" : { + "file" : "DateTime/Locale/kam_KE.pm" + }, + "DateTime::Locale::kcg" : { + "file" : "DateTime/Locale/kcg.pm" + }, + "DateTime::Locale::kcg_NG" : { + "file" : "DateTime/Locale/kcg_NG.pm" + }, + "DateTime::Locale::kfo" : { + "file" : "DateTime/Locale/kfo.pm" + }, + "DateTime::Locale::kfo_CI" : { + "file" : "DateTime/Locale/kfo_CI.pm" + }, + "DateTime::Locale::kk" : { + "file" : "DateTime/Locale/kk.pm" + }, + "DateTime::Locale::kk_Cyrl" : { + "file" : "DateTime/Locale/kk_Cyrl.pm" + }, + "DateTime::Locale::kk_Cyrl_KZ" : { + "file" : "DateTime/Locale/kk_Cyrl_KZ.pm" + }, + "DateTime::Locale::kk_KZ" : { + "file" : "DateTime/Locale/kk_KZ.pm" + }, + "DateTime::Locale::kl" : { + "file" : "DateTime/Locale/kl.pm" + }, + "DateTime::Locale::kl_GL" : { + "file" : "DateTime/Locale/kl_GL.pm" + }, + "DateTime::Locale::km" : { + "file" : "DateTime/Locale/km.pm" + }, + "DateTime::Locale::km_KH" : { + "file" : "DateTime/Locale/km_KH.pm" + }, + "DateTime::Locale::kn" : { + "file" : "DateTime/Locale/kn.pm" + }, + "DateTime::Locale::kn_IN" : { + "file" : "DateTime/Locale/kn_IN.pm" + }, + "DateTime::Locale::ko" : { + "file" : "DateTime/Locale/ko.pm" + }, + "DateTime::Locale::ko_KR" : { + "file" : "DateTime/Locale/ko_KR.pm" + }, + "DateTime::Locale::kok" : { + "file" : "DateTime/Locale/kok.pm" + }, + "DateTime::Locale::kok_IN" : { + "file" : "DateTime/Locale/kok_IN.pm" + }, + "DateTime::Locale::kpe" : { + "file" : "DateTime/Locale/kpe.pm" + }, + "DateTime::Locale::kpe_GN" : { + "file" : "DateTime/Locale/kpe_GN.pm" + }, + "DateTime::Locale::kpe_LR" : { + "file" : "DateTime/Locale/kpe_LR.pm" + }, + "DateTime::Locale::ku" : { + "file" : "DateTime/Locale/ku.pm" + }, + "DateTime::Locale::ku_Arab" : { + "file" : "DateTime/Locale/ku_Arab.pm" + }, + "DateTime::Locale::ku_Arab_IQ" : { + "file" : "DateTime/Locale/ku_Arab_IQ.pm" + }, + "DateTime::Locale::ku_Arab_IR" : { + "file" : "DateTime/Locale/ku_Arab_IR.pm" + }, + "DateTime::Locale::ku_Arab_SY" : { + "file" : "DateTime/Locale/ku_Arab_SY.pm" + }, + "DateTime::Locale::ku_IQ" : { + "file" : "DateTime/Locale/ku_IQ.pm" + }, + "DateTime::Locale::ku_IR" : { + "file" : "DateTime/Locale/ku_IR.pm" + }, + "DateTime::Locale::ku_Latn" : { + "file" : "DateTime/Locale/ku_Latn.pm" + }, + "DateTime::Locale::ku_Latn_TR" : { + "file" : "DateTime/Locale/ku_Latn_TR.pm" + }, + "DateTime::Locale::ku_SY" : { + "file" : "DateTime/Locale/ku_SY.pm" + }, + "DateTime::Locale::ku_TR" : { + "file" : "DateTime/Locale/ku_TR.pm" + }, + "DateTime::Locale::kw" : { + "file" : "DateTime/Locale/kw.pm" + }, + "DateTime::Locale::kw_GB" : { + "file" : "DateTime/Locale/kw_GB.pm" + }, + "DateTime::Locale::ky" : { + "file" : "DateTime/Locale/ky.pm" + }, + "DateTime::Locale::ky_KG" : { + "file" : "DateTime/Locale/ky_KG.pm" + }, + "DateTime::Locale::ln" : { + "file" : "DateTime/Locale/ln.pm" + }, + "DateTime::Locale::ln_CD" : { + "file" : "DateTime/Locale/ln_CD.pm" + }, + "DateTime::Locale::ln_CG" : { + "file" : "DateTime/Locale/ln_CG.pm" + }, + "DateTime::Locale::lo" : { + "file" : "DateTime/Locale/lo.pm" + }, + "DateTime::Locale::lo_LA" : { + "file" : "DateTime/Locale/lo_LA.pm" + }, + "DateTime::Locale::lt" : { + "file" : "DateTime/Locale/lt.pm" + }, + "DateTime::Locale::lt_LT" : { + "file" : "DateTime/Locale/lt_LT.pm" + }, + "DateTime::Locale::lv" : { + "file" : "DateTime/Locale/lv.pm" + }, + "DateTime::Locale::lv_LV" : { + "file" : "DateTime/Locale/lv_LV.pm" + }, + "DateTime::Locale::mk" : { + "file" : "DateTime/Locale/mk.pm" + }, + "DateTime::Locale::mk_MK" : { + "file" : "DateTime/Locale/mk_MK.pm" + }, + "DateTime::Locale::ml" : { + "file" : "DateTime/Locale/ml.pm" + }, + "DateTime::Locale::ml_IN" : { + "file" : "DateTime/Locale/ml_IN.pm" + }, + "DateTime::Locale::mn" : { + "file" : "DateTime/Locale/mn.pm" + }, + "DateTime::Locale::mn_CN" : { + "file" : "DateTime/Locale/mn_CN.pm" + }, + "DateTime::Locale::mn_Cyrl" : { + "file" : "DateTime/Locale/mn_Cyrl.pm" + }, + "DateTime::Locale::mn_Cyrl_MN" : { + "file" : "DateTime/Locale/mn_Cyrl_MN.pm" + }, + "DateTime::Locale::mn_MN" : { + "file" : "DateTime/Locale/mn_MN.pm" + }, + "DateTime::Locale::mn_Mong" : { + "file" : "DateTime/Locale/mn_Mong.pm" + }, + "DateTime::Locale::mn_Mong_CN" : { + "file" : "DateTime/Locale/mn_Mong_CN.pm" + }, + "DateTime::Locale::mo" : { + "file" : "DateTime/Locale/mo.pm" + }, + "DateTime::Locale::mr" : { + "file" : "DateTime/Locale/mr.pm" + }, + "DateTime::Locale::mr_IN" : { + "file" : "DateTime/Locale/mr_IN.pm" + }, + "DateTime::Locale::ms" : { + "file" : "DateTime/Locale/ms.pm" + }, + "DateTime::Locale::ms_BN" : { + "file" : "DateTime/Locale/ms_BN.pm" + }, + "DateTime::Locale::ms_MY" : { + "file" : "DateTime/Locale/ms_MY.pm" + }, + "DateTime::Locale::mt" : { + "file" : "DateTime/Locale/mt.pm" + }, + "DateTime::Locale::mt_MT" : { + "file" : "DateTime/Locale/mt_MT.pm" + }, + "DateTime::Locale::my" : { + "file" : "DateTime/Locale/my.pm" + }, + "DateTime::Locale::my_MM" : { + "file" : "DateTime/Locale/my_MM.pm" + }, + "DateTime::Locale::nb" : { + "file" : "DateTime/Locale/nb.pm" + }, + "DateTime::Locale::nb_NO" : { + "file" : "DateTime/Locale/nb_NO.pm" + }, + "DateTime::Locale::nds" : { + "file" : "DateTime/Locale/nds.pm" + }, + "DateTime::Locale::nds_DE" : { + "file" : "DateTime/Locale/nds_DE.pm" + }, + "DateTime::Locale::ne" : { + "file" : "DateTime/Locale/ne.pm" + }, + "DateTime::Locale::ne_IN" : { + "file" : "DateTime/Locale/ne_IN.pm" + }, + "DateTime::Locale::ne_NP" : { + "file" : "DateTime/Locale/ne_NP.pm" + }, + "DateTime::Locale::nl" : { + "file" : "DateTime/Locale/nl.pm" + }, + "DateTime::Locale::nl_BE" : { + "file" : "DateTime/Locale/nl_BE.pm" + }, + "DateTime::Locale::nl_NL" : { + "file" : "DateTime/Locale/nl_NL.pm" + }, + "DateTime::Locale::nn" : { + "file" : "DateTime/Locale/nn.pm" + }, + "DateTime::Locale::nn_NO" : { + "file" : "DateTime/Locale/nn_NO.pm" + }, + "DateTime::Locale::no" : { + "file" : "DateTime/Locale/no.pm" + }, + "DateTime::Locale::nr" : { + "file" : "DateTime/Locale/nr.pm" + }, + "DateTime::Locale::nr_ZA" : { + "file" : "DateTime/Locale/nr_ZA.pm" + }, + "DateTime::Locale::nso" : { + "file" : "DateTime/Locale/nso.pm" + }, + "DateTime::Locale::nso_ZA" : { + "file" : "DateTime/Locale/nso_ZA.pm" + }, + "DateTime::Locale::ny" : { + "file" : "DateTime/Locale/ny.pm" + }, + "DateTime::Locale::ny_MW" : { + "file" : "DateTime/Locale/ny_MW.pm" + }, + "DateTime::Locale::oc" : { + "file" : "DateTime/Locale/oc.pm" + }, + "DateTime::Locale::oc_FR" : { + "file" : "DateTime/Locale/oc_FR.pm" + }, + "DateTime::Locale::om" : { + "file" : "DateTime/Locale/om.pm" + }, + "DateTime::Locale::om_ET" : { + "file" : "DateTime/Locale/om_ET.pm" + }, + "DateTime::Locale::om_KE" : { + "file" : "DateTime/Locale/om_KE.pm" + }, + "DateTime::Locale::or" : { + "file" : "DateTime/Locale/or.pm" + }, + "DateTime::Locale::or_IN" : { + "file" : "DateTime/Locale/or_IN.pm" + }, + "DateTime::Locale::pa" : { + "file" : "DateTime/Locale/pa.pm" + }, + "DateTime::Locale::pa_Arab" : { + "file" : "DateTime/Locale/pa_Arab.pm" + }, + "DateTime::Locale::pa_Arab_PK" : { + "file" : "DateTime/Locale/pa_Arab_PK.pm" + }, + "DateTime::Locale::pa_Guru" : { + "file" : "DateTime/Locale/pa_Guru.pm" + }, + "DateTime::Locale::pa_Guru_IN" : { + "file" : "DateTime/Locale/pa_Guru_IN.pm" + }, + "DateTime::Locale::pa_IN" : { + "file" : "DateTime/Locale/pa_IN.pm" + }, + "DateTime::Locale::pa_PK" : { + "file" : "DateTime/Locale/pa_PK.pm" + }, + "DateTime::Locale::pl" : { + "file" : "DateTime/Locale/pl.pm" + }, + "DateTime::Locale::pl_PL" : { + "file" : "DateTime/Locale/pl_PL.pm" + }, + "DateTime::Locale::ps" : { + "file" : "DateTime/Locale/ps.pm" + }, + "DateTime::Locale::ps_AF" : { + "file" : "DateTime/Locale/ps_AF.pm" + }, + "DateTime::Locale::pt" : { + "file" : "DateTime/Locale/pt.pm" + }, + "DateTime::Locale::pt_BR" : { + "file" : "DateTime/Locale/pt_BR.pm" + }, + "DateTime::Locale::pt_PT" : { + "file" : "DateTime/Locale/pt_PT.pm" + }, + "DateTime::Locale::ro" : { + "file" : "DateTime/Locale/ro.pm" + }, + "DateTime::Locale::ro_MD" : { + "file" : "DateTime/Locale/ro_MD.pm" + }, + "DateTime::Locale::ro_RO" : { + "file" : "DateTime/Locale/ro_RO.pm" + }, + "DateTime::Locale::root" : { + "file" : "DateTime/Locale/root.pm" + }, + "DateTime::Locale::ru" : { + "file" : "DateTime/Locale/ru.pm" + }, + "DateTime::Locale::ru_RU" : { + "file" : "DateTime/Locale/ru_RU.pm" + }, + "DateTime::Locale::ru_UA" : { + "file" : "DateTime/Locale/ru_UA.pm" + }, + "DateTime::Locale::rw" : { + "file" : "DateTime/Locale/rw.pm" + }, + "DateTime::Locale::rw_RW" : { + "file" : "DateTime/Locale/rw_RW.pm" + }, + "DateTime::Locale::sa" : { + "file" : "DateTime/Locale/sa.pm" + }, + "DateTime::Locale::sa_IN" : { + "file" : "DateTime/Locale/sa_IN.pm" + }, + "DateTime::Locale::se" : { + "file" : "DateTime/Locale/se.pm" + }, + "DateTime::Locale::se_FI" : { + "file" : "DateTime/Locale/se_FI.pm" + }, + "DateTime::Locale::se_NO" : { + "file" : "DateTime/Locale/se_NO.pm" + }, + "DateTime::Locale::sh" : { + "file" : "DateTime/Locale/sh.pm" + }, + "DateTime::Locale::sh_BA" : { + "file" : "DateTime/Locale/sh_BA.pm" + }, + "DateTime::Locale::sh_CS" : { + "file" : "DateTime/Locale/sh_CS.pm" + }, + "DateTime::Locale::sh_YU" : { + "file" : "DateTime/Locale/sh_YU.pm" + }, + "DateTime::Locale::si" : { + "file" : "DateTime/Locale/si.pm" + }, + "DateTime::Locale::si_LK" : { + "file" : "DateTime/Locale/si_LK.pm" + }, + "DateTime::Locale::sid" : { + "file" : "DateTime/Locale/sid.pm" + }, + "DateTime::Locale::sid_ET" : { + "file" : "DateTime/Locale/sid_ET.pm" + }, + "DateTime::Locale::sk" : { + "file" : "DateTime/Locale/sk.pm" + }, + "DateTime::Locale::sk_SK" : { + "file" : "DateTime/Locale/sk_SK.pm" + }, + "DateTime::Locale::sl" : { + "file" : "DateTime/Locale/sl.pm" + }, + "DateTime::Locale::sl_SI" : { + "file" : "DateTime/Locale/sl_SI.pm" + }, + "DateTime::Locale::so" : { + "file" : "DateTime/Locale/so.pm" + }, + "DateTime::Locale::so_DJ" : { + "file" : "DateTime/Locale/so_DJ.pm" + }, + "DateTime::Locale::so_ET" : { + "file" : "DateTime/Locale/so_ET.pm" + }, + "DateTime::Locale::so_KE" : { + "file" : "DateTime/Locale/so_KE.pm" + }, + "DateTime::Locale::so_SO" : { + "file" : "DateTime/Locale/so_SO.pm" + }, + "DateTime::Locale::sq" : { + "file" : "DateTime/Locale/sq.pm" + }, + "DateTime::Locale::sq_AL" : { + "file" : "DateTime/Locale/sq_AL.pm" + }, + "DateTime::Locale::sr" : { + "file" : "DateTime/Locale/sr.pm" + }, + "DateTime::Locale::sr_BA" : { + "file" : "DateTime/Locale/sr_BA.pm" + }, + "DateTime::Locale::sr_CS" : { + "file" : "DateTime/Locale/sr_CS.pm" + }, + "DateTime::Locale::sr_Cyrl" : { + "file" : "DateTime/Locale/sr_Cyrl.pm" + }, + "DateTime::Locale::sr_Cyrl_BA" : { + "file" : "DateTime/Locale/sr_Cyrl_BA.pm" + }, + "DateTime::Locale::sr_Cyrl_CS" : { + "file" : "DateTime/Locale/sr_Cyrl_CS.pm" + }, + "DateTime::Locale::sr_Cyrl_ME" : { + "file" : "DateTime/Locale/sr_Cyrl_ME.pm" + }, + "DateTime::Locale::sr_Cyrl_RS" : { + "file" : "DateTime/Locale/sr_Cyrl_RS.pm" + }, + "DateTime::Locale::sr_Cyrl_YU" : { + "file" : "DateTime/Locale/sr_Cyrl_YU.pm" + }, + "DateTime::Locale::sr_Latn" : { + "file" : "DateTime/Locale/sr_Latn.pm" + }, + "DateTime::Locale::sr_Latn_BA" : { + "file" : "DateTime/Locale/sr_Latn_BA.pm" + }, + "DateTime::Locale::sr_Latn_CS" : { + "file" : "DateTime/Locale/sr_Latn_CS.pm" + }, + "DateTime::Locale::sr_Latn_ME" : { + "file" : "DateTime/Locale/sr_Latn_ME.pm" + }, + "DateTime::Locale::sr_Latn_RS" : { + "file" : "DateTime/Locale/sr_Latn_RS.pm" + }, + "DateTime::Locale::sr_Latn_YU" : { + "file" : "DateTime/Locale/sr_Latn_YU.pm" + }, + "DateTime::Locale::sr_ME" : { + "file" : "DateTime/Locale/sr_ME.pm" + }, + "DateTime::Locale::sr_RS" : { + "file" : "DateTime/Locale/sr_RS.pm" + }, + "DateTime::Locale::sr_YU" : { + "file" : "DateTime/Locale/sr_YU.pm" + }, + "DateTime::Locale::ss" : { + "file" : "DateTime/Locale/ss.pm" + }, + "DateTime::Locale::ss_SZ" : { + "file" : "DateTime/Locale/ss_SZ.pm" + }, + "DateTime::Locale::ss_ZA" : { + "file" : "DateTime/Locale/ss_ZA.pm" + }, + "DateTime::Locale::st" : { + "file" : "DateTime/Locale/st.pm" + }, + "DateTime::Locale::st_LS" : { + "file" : "DateTime/Locale/st_LS.pm" + }, + "DateTime::Locale::st_ZA" : { + "file" : "DateTime/Locale/st_ZA.pm" + }, + "DateTime::Locale::sv" : { + "file" : "DateTime/Locale/sv.pm" + }, + "DateTime::Locale::sv_FI" : { + "file" : "DateTime/Locale/sv_FI.pm" + }, + "DateTime::Locale::sv_SE" : { + "file" : "DateTime/Locale/sv_SE.pm" + }, + "DateTime::Locale::sw" : { + "file" : "DateTime/Locale/sw.pm" + }, + "DateTime::Locale::sw_KE" : { + "file" : "DateTime/Locale/sw_KE.pm" + }, + "DateTime::Locale::sw_TZ" : { + "file" : "DateTime/Locale/sw_TZ.pm" + }, + "DateTime::Locale::syr" : { + "file" : "DateTime/Locale/syr.pm" + }, + "DateTime::Locale::syr_SY" : { + "file" : "DateTime/Locale/syr_SY.pm" + }, + "DateTime::Locale::ta" : { + "file" : "DateTime/Locale/ta.pm" + }, + "DateTime::Locale::ta_IN" : { + "file" : "DateTime/Locale/ta_IN.pm" + }, + "DateTime::Locale::te" : { + "file" : "DateTime/Locale/te.pm" + }, + "DateTime::Locale::te_IN" : { + "file" : "DateTime/Locale/te_IN.pm" + }, + "DateTime::Locale::tg" : { + "file" : "DateTime/Locale/tg.pm" + }, + "DateTime::Locale::tg_Cyrl" : { + "file" : "DateTime/Locale/tg_Cyrl.pm" + }, + "DateTime::Locale::tg_Cyrl_TJ" : { + "file" : "DateTime/Locale/tg_Cyrl_TJ.pm" + }, + "DateTime::Locale::tg_TJ" : { + "file" : "DateTime/Locale/tg_TJ.pm" + }, + "DateTime::Locale::th" : { + "file" : "DateTime/Locale/th.pm" + }, + "DateTime::Locale::th_TH" : { + "file" : "DateTime/Locale/th_TH.pm" + }, + "DateTime::Locale::ti" : { + "file" : "DateTime/Locale/ti.pm" + }, + "DateTime::Locale::ti_ER" : { + "file" : "DateTime/Locale/ti_ER.pm" + }, + "DateTime::Locale::ti_ET" : { + "file" : "DateTime/Locale/ti_ET.pm" + }, + "DateTime::Locale::tig" : { + "file" : "DateTime/Locale/tig.pm" + }, + "DateTime::Locale::tig_ER" : { + "file" : "DateTime/Locale/tig_ER.pm" + }, + "DateTime::Locale::tl" : { + "file" : "DateTime/Locale/tl.pm" + }, + "DateTime::Locale::tn" : { + "file" : "DateTime/Locale/tn.pm" + }, + "DateTime::Locale::tn_ZA" : { + "file" : "DateTime/Locale/tn_ZA.pm" + }, + "DateTime::Locale::to" : { + "file" : "DateTime/Locale/to.pm" + }, + "DateTime::Locale::to_TO" : { + "file" : "DateTime/Locale/to_TO.pm" + }, + "DateTime::Locale::tr" : { + "file" : "DateTime/Locale/tr.pm" + }, + "DateTime::Locale::tr_TR" : { + "file" : "DateTime/Locale/tr_TR.pm" + }, + "DateTime::Locale::trv" : { + "file" : "DateTime/Locale/trv.pm" + }, + "DateTime::Locale::trv_TW" : { + "file" : "DateTime/Locale/trv_TW.pm" + }, + "DateTime::Locale::ts" : { + "file" : "DateTime/Locale/ts.pm" + }, + "DateTime::Locale::ts_ZA" : { + "file" : "DateTime/Locale/ts_ZA.pm" + }, + "DateTime::Locale::tt" : { + "file" : "DateTime/Locale/tt.pm" + }, + "DateTime::Locale::tt_RU" : { + "file" : "DateTime/Locale/tt_RU.pm" + }, + "DateTime::Locale::ug" : { + "file" : "DateTime/Locale/ug.pm" + }, + "DateTime::Locale::ug_Arab" : { + "file" : "DateTime/Locale/ug_Arab.pm" + }, + "DateTime::Locale::ug_Arab_CN" : { + "file" : "DateTime/Locale/ug_Arab_CN.pm" + }, + "DateTime::Locale::ug_CN" : { + "file" : "DateTime/Locale/ug_CN.pm" + }, + "DateTime::Locale::uk" : { + "file" : "DateTime/Locale/uk.pm" + }, + "DateTime::Locale::uk_UA" : { + "file" : "DateTime/Locale/uk_UA.pm" + }, + "DateTime::Locale::ur" : { + "file" : "DateTime/Locale/ur.pm" + }, + "DateTime::Locale::ur_IN" : { + "file" : "DateTime/Locale/ur_IN.pm" + }, + "DateTime::Locale::ur_PK" : { + "file" : "DateTime/Locale/ur_PK.pm" + }, + "DateTime::Locale::uz" : { + "file" : "DateTime/Locale/uz.pm" + }, + "DateTime::Locale::uz_AF" : { + "file" : "DateTime/Locale/uz_AF.pm" + }, + "DateTime::Locale::uz_Arab" : { + "file" : "DateTime/Locale/uz_Arab.pm" + }, + "DateTime::Locale::uz_Arab_AF" : { + "file" : "DateTime/Locale/uz_Arab_AF.pm" + }, + "DateTime::Locale::uz_Cyrl" : { + "file" : "DateTime/Locale/uz_Cyrl.pm" + }, + "DateTime::Locale::uz_Cyrl_UZ" : { + "file" : "DateTime/Locale/uz_Cyrl_UZ.pm" + }, + "DateTime::Locale::uz_Latn" : { + "file" : "DateTime/Locale/uz_Latn.pm" + }, + "DateTime::Locale::uz_Latn_UZ" : { + "file" : "DateTime/Locale/uz_Latn_UZ.pm" + }, + "DateTime::Locale::uz_UZ" : { + "file" : "DateTime/Locale/uz_UZ.pm" + }, + "DateTime::Locale::ve" : { + "file" : "DateTime/Locale/ve.pm" + }, + "DateTime::Locale::ve_ZA" : { + "file" : "DateTime/Locale/ve_ZA.pm" + }, + "DateTime::Locale::vi" : { + "file" : "DateTime/Locale/vi.pm" + }, + "DateTime::Locale::vi_VN" : { + "file" : "DateTime/Locale/vi_VN.pm" + }, + "DateTime::Locale::wal" : { + "file" : "DateTime/Locale/wal.pm" + }, + "DateTime::Locale::wal_ET" : { + "file" : "DateTime/Locale/wal_ET.pm" + }, + "DateTime::Locale::wo" : { + "file" : "DateTime/Locale/wo.pm" + }, + "DateTime::Locale::wo_Latn" : { + "file" : "DateTime/Locale/wo_Latn.pm" + }, + "DateTime::Locale::wo_Latn_SN" : { + "file" : "DateTime/Locale/wo_Latn_SN.pm" + }, + "DateTime::Locale::wo_SN" : { + "file" : "DateTime/Locale/wo_SN.pm" + }, + "DateTime::Locale::xh" : { + "file" : "DateTime/Locale/xh.pm" + }, + "DateTime::Locale::xh_ZA" : { + "file" : "DateTime/Locale/xh_ZA.pm" + }, + "DateTime::Locale::yo" : { + "file" : "DateTime/Locale/yo.pm" + }, + "DateTime::Locale::yo_NG" : { + "file" : "DateTime/Locale/yo_NG.pm" + }, + "DateTime::Locale::zh" : { + "file" : "DateTime/Locale/zh.pm" + }, + "DateTime::Locale::zh_CN" : { + "file" : "DateTime/Locale/zh_CN.pm" + }, + "DateTime::Locale::zh_HK" : { + "file" : "DateTime/Locale/zh_HK.pm" + }, + "DateTime::Locale::zh_Hans" : { + "file" : "DateTime/Locale/zh_Hans.pm" + }, + "DateTime::Locale::zh_Hans_CN" : { + "file" : "DateTime/Locale/zh_Hans_CN.pm" + }, + "DateTime::Locale::zh_Hans_HK" : { + "file" : "DateTime/Locale/zh_Hans_HK.pm" + }, + "DateTime::Locale::zh_Hans_MO" : { + "file" : "DateTime/Locale/zh_Hans_MO.pm" + }, + "DateTime::Locale::zh_Hans_SG" : { + "file" : "DateTime/Locale/zh_Hans_SG.pm" + }, + "DateTime::Locale::zh_Hant" : { + "file" : "DateTime/Locale/zh_Hant.pm" + }, + "DateTime::Locale::zh_Hant_HK" : { + "file" : "DateTime/Locale/zh_Hant_HK.pm" + }, + "DateTime::Locale::zh_Hant_MO" : { + "file" : "DateTime/Locale/zh_Hant_MO.pm" + }, + "DateTime::Locale::zh_Hant_TW" : { + "file" : "DateTime/Locale/zh_Hant_TW.pm" + }, + "DateTime::Locale::zh_MO" : { + "file" : "DateTime/Locale/zh_MO.pm" + }, + "DateTime::Locale::zh_SG" : { + "file" : "DateTime/Locale/zh_SG.pm" + }, + "DateTime::Locale::zh_TW" : { + "file" : "DateTime/Locale/zh_TW.pm" + }, + "DateTime::Locale::zu" : { + "file" : "DateTime/Locale/zu.pm" + }, + "DateTime::Locale::zu_ZA" : { + "file" : "DateTime/Locale/zu_ZA.pm" + } + }, + "version" : "0.45" + }, + "DateTime::TimeZone" : { + "dist" : "DateTime-TimeZone-1.42", + "module" : "DateTime::TimeZone", + "mymeta" : { + "abstract" : "Time zone object base class and factory", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300002, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "DateTime-TimeZone", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.58" + } + }, + "runtime" : { + "requires" : { + "Class::Load" : 0, + "Class::Singleton" : "1.03", + "Cwd" : "3", + "Params::Validate" : "0.72", + "Pod::Man" : "1.14", + "parent" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=DateTime-TimeZone" + }, + "repository" : { + "type" : "git", + "url" : "git://git.urth.org/DateTime-TimeZone.git" + } + }, + "version" : "1.42" + }, + "name" : "DateTime::TimeZone", + "pathname" : "D/DR/DROLSKY/DateTime-TimeZone-1.42.tar.gz", + "provides" : { + "DateTime::TimeZone" : { + "file" : "DateTime/TimeZone.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Abidjan" : { + "file" : "DateTime/TimeZone/Africa/Abidjan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Accra" : { + "file" : "DateTime/TimeZone/Africa/Accra.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Addis_Ababa" : { + "file" : "DateTime/TimeZone/Africa/Addis_Ababa.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Algiers" : { + "file" : "DateTime/TimeZone/Africa/Algiers.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Asmara" : { + "file" : "DateTime/TimeZone/Africa/Asmara.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Bamako" : { + "file" : "DateTime/TimeZone/Africa/Bamako.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Bangui" : { + "file" : "DateTime/TimeZone/Africa/Bangui.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Banjul" : { + "file" : "DateTime/TimeZone/Africa/Banjul.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Bissau" : { + "file" : "DateTime/TimeZone/Africa/Bissau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Blantyre" : { + "file" : "DateTime/TimeZone/Africa/Blantyre.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Brazzaville" : { + "file" : "DateTime/TimeZone/Africa/Brazzaville.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Bujumbura" : { + "file" : "DateTime/TimeZone/Africa/Bujumbura.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Cairo" : { + "file" : "DateTime/TimeZone/Africa/Cairo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Casablanca" : { + "file" : "DateTime/TimeZone/Africa/Casablanca.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Ceuta" : { + "file" : "DateTime/TimeZone/Africa/Ceuta.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Conakry" : { + "file" : "DateTime/TimeZone/Africa/Conakry.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Dakar" : { + "file" : "DateTime/TimeZone/Africa/Dakar.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Dar_es_Salaam" : { + "file" : "DateTime/TimeZone/Africa/Dar_es_Salaam.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Djibouti" : { + "file" : "DateTime/TimeZone/Africa/Djibouti.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Douala" : { + "file" : "DateTime/TimeZone/Africa/Douala.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::El_Aaiun" : { + "file" : "DateTime/TimeZone/Africa/El_Aaiun.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Freetown" : { + "file" : "DateTime/TimeZone/Africa/Freetown.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Gaborone" : { + "file" : "DateTime/TimeZone/Africa/Gaborone.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Harare" : { + "file" : "DateTime/TimeZone/Africa/Harare.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Johannesburg" : { + "file" : "DateTime/TimeZone/Africa/Johannesburg.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Juba" : { + "file" : "DateTime/TimeZone/Africa/Juba.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Kampala" : { + "file" : "DateTime/TimeZone/Africa/Kampala.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Khartoum" : { + "file" : "DateTime/TimeZone/Africa/Khartoum.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Kigali" : { + "file" : "DateTime/TimeZone/Africa/Kigali.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Kinshasa" : { + "file" : "DateTime/TimeZone/Africa/Kinshasa.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Lagos" : { + "file" : "DateTime/TimeZone/Africa/Lagos.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Libreville" : { + "file" : "DateTime/TimeZone/Africa/Libreville.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Lome" : { + "file" : "DateTime/TimeZone/Africa/Lome.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Luanda" : { + "file" : "DateTime/TimeZone/Africa/Luanda.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Lubumbashi" : { + "file" : "DateTime/TimeZone/Africa/Lubumbashi.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Lusaka" : { + "file" : "DateTime/TimeZone/Africa/Lusaka.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Malabo" : { + "file" : "DateTime/TimeZone/Africa/Malabo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Maputo" : { + "file" : "DateTime/TimeZone/Africa/Maputo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Maseru" : { + "file" : "DateTime/TimeZone/Africa/Maseru.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Mbabane" : { + "file" : "DateTime/TimeZone/Africa/Mbabane.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Mogadishu" : { + "file" : "DateTime/TimeZone/Africa/Mogadishu.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Monrovia" : { + "file" : "DateTime/TimeZone/Africa/Monrovia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Nairobi" : { + "file" : "DateTime/TimeZone/Africa/Nairobi.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Ndjamena" : { + "file" : "DateTime/TimeZone/Africa/Ndjamena.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Niamey" : { + "file" : "DateTime/TimeZone/Africa/Niamey.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Nouakchott" : { + "file" : "DateTime/TimeZone/Africa/Nouakchott.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Ouagadougou" : { + "file" : "DateTime/TimeZone/Africa/Ouagadougou.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Porto_Novo" : { + "file" : "DateTime/TimeZone/Africa/Porto_Novo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Sao_Tome" : { + "file" : "DateTime/TimeZone/Africa/Sao_Tome.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Tripoli" : { + "file" : "DateTime/TimeZone/Africa/Tripoli.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Tunis" : { + "file" : "DateTime/TimeZone/Africa/Tunis.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Africa::Windhoek" : { + "file" : "DateTime/TimeZone/Africa/Windhoek.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Adak" : { + "file" : "DateTime/TimeZone/America/Adak.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Anchorage" : { + "file" : "DateTime/TimeZone/America/Anchorage.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Anguilla" : { + "file" : "DateTime/TimeZone/America/Anguilla.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Antigua" : { + "file" : "DateTime/TimeZone/America/Antigua.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Araguaina" : { + "file" : "DateTime/TimeZone/America/Araguaina.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Buenos_Aires" : { + "file" : "DateTime/TimeZone/America/Argentina/Buenos_Aires.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Catamarca" : { + "file" : "DateTime/TimeZone/America/Argentina/Catamarca.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Cordoba" : { + "file" : "DateTime/TimeZone/America/Argentina/Cordoba.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Jujuy" : { + "file" : "DateTime/TimeZone/America/Argentina/Jujuy.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::La_Rioja" : { + "file" : "DateTime/TimeZone/America/Argentina/La_Rioja.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Mendoza" : { + "file" : "DateTime/TimeZone/America/Argentina/Mendoza.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Rio_Gallegos" : { + "file" : "DateTime/TimeZone/America/Argentina/Rio_Gallegos.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Salta" : { + "file" : "DateTime/TimeZone/America/Argentina/Salta.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::San_Juan" : { + "file" : "DateTime/TimeZone/America/Argentina/San_Juan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::San_Luis" : { + "file" : "DateTime/TimeZone/America/Argentina/San_Luis.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Tucuman" : { + "file" : "DateTime/TimeZone/America/Argentina/Tucuman.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Argentina::Ushuaia" : { + "file" : "DateTime/TimeZone/America/Argentina/Ushuaia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Aruba" : { + "file" : "DateTime/TimeZone/America/Aruba.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Asuncion" : { + "file" : "DateTime/TimeZone/America/Asuncion.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Atikokan" : { + "file" : "DateTime/TimeZone/America/Atikokan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Bahia" : { + "file" : "DateTime/TimeZone/America/Bahia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Bahia_Banderas" : { + "file" : "DateTime/TimeZone/America/Bahia_Banderas.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Barbados" : { + "file" : "DateTime/TimeZone/America/Barbados.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Belem" : { + "file" : "DateTime/TimeZone/America/Belem.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Belize" : { + "file" : "DateTime/TimeZone/America/Belize.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Blanc_Sablon" : { + "file" : "DateTime/TimeZone/America/Blanc_Sablon.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Boa_Vista" : { + "file" : "DateTime/TimeZone/America/Boa_Vista.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Bogota" : { + "file" : "DateTime/TimeZone/America/Bogota.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Boise" : { + "file" : "DateTime/TimeZone/America/Boise.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Cambridge_Bay" : { + "file" : "DateTime/TimeZone/America/Cambridge_Bay.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Campo_Grande" : { + "file" : "DateTime/TimeZone/America/Campo_Grande.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Cancun" : { + "file" : "DateTime/TimeZone/America/Cancun.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Caracas" : { + "file" : "DateTime/TimeZone/America/Caracas.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Cayenne" : { + "file" : "DateTime/TimeZone/America/Cayenne.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Cayman" : { + "file" : "DateTime/TimeZone/America/Cayman.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Chicago" : { + "file" : "DateTime/TimeZone/America/Chicago.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Chihuahua" : { + "file" : "DateTime/TimeZone/America/Chihuahua.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Costa_Rica" : { + "file" : "DateTime/TimeZone/America/Costa_Rica.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Cuiaba" : { + "file" : "DateTime/TimeZone/America/Cuiaba.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Curacao" : { + "file" : "DateTime/TimeZone/America/Curacao.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Danmarkshavn" : { + "file" : "DateTime/TimeZone/America/Danmarkshavn.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Dawson" : { + "file" : "DateTime/TimeZone/America/Dawson.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Dawson_Creek" : { + "file" : "DateTime/TimeZone/America/Dawson_Creek.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Denver" : { + "file" : "DateTime/TimeZone/America/Denver.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Detroit" : { + "file" : "DateTime/TimeZone/America/Detroit.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Dominica" : { + "file" : "DateTime/TimeZone/America/Dominica.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Edmonton" : { + "file" : "DateTime/TimeZone/America/Edmonton.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Eirunepe" : { + "file" : "DateTime/TimeZone/America/Eirunepe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::El_Salvador" : { + "file" : "DateTime/TimeZone/America/El_Salvador.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Fortaleza" : { + "file" : "DateTime/TimeZone/America/Fortaleza.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Glace_Bay" : { + "file" : "DateTime/TimeZone/America/Glace_Bay.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Godthab" : { + "file" : "DateTime/TimeZone/America/Godthab.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Goose_Bay" : { + "file" : "DateTime/TimeZone/America/Goose_Bay.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Grand_Turk" : { + "file" : "DateTime/TimeZone/America/Grand_Turk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Grenada" : { + "file" : "DateTime/TimeZone/America/Grenada.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Guadeloupe" : { + "file" : "DateTime/TimeZone/America/Guadeloupe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Guatemala" : { + "file" : "DateTime/TimeZone/America/Guatemala.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Guayaquil" : { + "file" : "DateTime/TimeZone/America/Guayaquil.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Guyana" : { + "file" : "DateTime/TimeZone/America/Guyana.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Halifax" : { + "file" : "DateTime/TimeZone/America/Halifax.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Havana" : { + "file" : "DateTime/TimeZone/America/Havana.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Hermosillo" : { + "file" : "DateTime/TimeZone/America/Hermosillo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Indianapolis" : { + "file" : "DateTime/TimeZone/America/Indiana/Indianapolis.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Knox" : { + "file" : "DateTime/TimeZone/America/Indiana/Knox.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Marengo" : { + "file" : "DateTime/TimeZone/America/Indiana/Marengo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Petersburg" : { + "file" : "DateTime/TimeZone/America/Indiana/Petersburg.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Tell_City" : { + "file" : "DateTime/TimeZone/America/Indiana/Tell_City.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Vevay" : { + "file" : "DateTime/TimeZone/America/Indiana/Vevay.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Vincennes" : { + "file" : "DateTime/TimeZone/America/Indiana/Vincennes.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Indiana::Winamac" : { + "file" : "DateTime/TimeZone/America/Indiana/Winamac.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Inuvik" : { + "file" : "DateTime/TimeZone/America/Inuvik.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Iqaluit" : { + "file" : "DateTime/TimeZone/America/Iqaluit.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Jamaica" : { + "file" : "DateTime/TimeZone/America/Jamaica.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Juneau" : { + "file" : "DateTime/TimeZone/America/Juneau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Kentucky::Louisville" : { + "file" : "DateTime/TimeZone/America/Kentucky/Louisville.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Kentucky::Monticello" : { + "file" : "DateTime/TimeZone/America/Kentucky/Monticello.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::La_Paz" : { + "file" : "DateTime/TimeZone/America/La_Paz.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Lima" : { + "file" : "DateTime/TimeZone/America/Lima.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Los_Angeles" : { + "file" : "DateTime/TimeZone/America/Los_Angeles.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Maceio" : { + "file" : "DateTime/TimeZone/America/Maceio.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Managua" : { + "file" : "DateTime/TimeZone/America/Managua.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Manaus" : { + "file" : "DateTime/TimeZone/America/Manaus.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Martinique" : { + "file" : "DateTime/TimeZone/America/Martinique.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Matamoros" : { + "file" : "DateTime/TimeZone/America/Matamoros.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Mazatlan" : { + "file" : "DateTime/TimeZone/America/Mazatlan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Menominee" : { + "file" : "DateTime/TimeZone/America/Menominee.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Merida" : { + "file" : "DateTime/TimeZone/America/Merida.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Metlakatla" : { + "file" : "DateTime/TimeZone/America/Metlakatla.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Mexico_City" : { + "file" : "DateTime/TimeZone/America/Mexico_City.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Miquelon" : { + "file" : "DateTime/TimeZone/America/Miquelon.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Moncton" : { + "file" : "DateTime/TimeZone/America/Moncton.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Monterrey" : { + "file" : "DateTime/TimeZone/America/Monterrey.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Montevideo" : { + "file" : "DateTime/TimeZone/America/Montevideo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Montreal" : { + "file" : "DateTime/TimeZone/America/Montreal.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Montserrat" : { + "file" : "DateTime/TimeZone/America/Montserrat.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Nassau" : { + "file" : "DateTime/TimeZone/America/Nassau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::New_York" : { + "file" : "DateTime/TimeZone/America/New_York.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Nipigon" : { + "file" : "DateTime/TimeZone/America/Nipigon.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Nome" : { + "file" : "DateTime/TimeZone/America/Nome.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Noronha" : { + "file" : "DateTime/TimeZone/America/Noronha.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::North_Dakota::Beulah" : { + "file" : "DateTime/TimeZone/America/North_Dakota/Beulah.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::North_Dakota::Center" : { + "file" : "DateTime/TimeZone/America/North_Dakota/Center.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::North_Dakota::New_Salem" : { + "file" : "DateTime/TimeZone/America/North_Dakota/New_Salem.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Ojinaga" : { + "file" : "DateTime/TimeZone/America/Ojinaga.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Panama" : { + "file" : "DateTime/TimeZone/America/Panama.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Pangnirtung" : { + "file" : "DateTime/TimeZone/America/Pangnirtung.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Paramaribo" : { + "file" : "DateTime/TimeZone/America/Paramaribo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Phoenix" : { + "file" : "DateTime/TimeZone/America/Phoenix.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Port_au_Prince" : { + "file" : "DateTime/TimeZone/America/Port_au_Prince.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Port_of_Spain" : { + "file" : "DateTime/TimeZone/America/Port_of_Spain.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Porto_Velho" : { + "file" : "DateTime/TimeZone/America/Porto_Velho.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Puerto_Rico" : { + "file" : "DateTime/TimeZone/America/Puerto_Rico.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Rainy_River" : { + "file" : "DateTime/TimeZone/America/Rainy_River.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Rankin_Inlet" : { + "file" : "DateTime/TimeZone/America/Rankin_Inlet.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Recife" : { + "file" : "DateTime/TimeZone/America/Recife.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Regina" : { + "file" : "DateTime/TimeZone/America/Regina.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Resolute" : { + "file" : "DateTime/TimeZone/America/Resolute.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Rio_Branco" : { + "file" : "DateTime/TimeZone/America/Rio_Branco.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Santa_Isabel" : { + "file" : "DateTime/TimeZone/America/Santa_Isabel.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Santarem" : { + "file" : "DateTime/TimeZone/America/Santarem.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Santiago" : { + "file" : "DateTime/TimeZone/America/Santiago.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Santo_Domingo" : { + "file" : "DateTime/TimeZone/America/Santo_Domingo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Sao_Paulo" : { + "file" : "DateTime/TimeZone/America/Sao_Paulo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Scoresbysund" : { + "file" : "DateTime/TimeZone/America/Scoresbysund.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Sitka" : { + "file" : "DateTime/TimeZone/America/Sitka.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::St_Johns" : { + "file" : "DateTime/TimeZone/America/St_Johns.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::St_Kitts" : { + "file" : "DateTime/TimeZone/America/St_Kitts.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::St_Lucia" : { + "file" : "DateTime/TimeZone/America/St_Lucia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::St_Thomas" : { + "file" : "DateTime/TimeZone/America/St_Thomas.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::St_Vincent" : { + "file" : "DateTime/TimeZone/America/St_Vincent.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Swift_Current" : { + "file" : "DateTime/TimeZone/America/Swift_Current.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Tegucigalpa" : { + "file" : "DateTime/TimeZone/America/Tegucigalpa.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Thule" : { + "file" : "DateTime/TimeZone/America/Thule.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Thunder_Bay" : { + "file" : "DateTime/TimeZone/America/Thunder_Bay.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Tijuana" : { + "file" : "DateTime/TimeZone/America/Tijuana.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Toronto" : { + "file" : "DateTime/TimeZone/America/Toronto.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Tortola" : { + "file" : "DateTime/TimeZone/America/Tortola.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Vancouver" : { + "file" : "DateTime/TimeZone/America/Vancouver.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Whitehorse" : { + "file" : "DateTime/TimeZone/America/Whitehorse.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Winnipeg" : { + "file" : "DateTime/TimeZone/America/Winnipeg.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Yakutat" : { + "file" : "DateTime/TimeZone/America/Yakutat.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::America::Yellowknife" : { + "file" : "DateTime/TimeZone/America/Yellowknife.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Casey" : { + "file" : "DateTime/TimeZone/Antarctica/Casey.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Davis" : { + "file" : "DateTime/TimeZone/Antarctica/Davis.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::DumontDUrville" : { + "file" : "DateTime/TimeZone/Antarctica/DumontDUrville.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Macquarie" : { + "file" : "DateTime/TimeZone/Antarctica/Macquarie.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Mawson" : { + "file" : "DateTime/TimeZone/Antarctica/Mawson.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::McMurdo" : { + "file" : "DateTime/TimeZone/Antarctica/McMurdo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Palmer" : { + "file" : "DateTime/TimeZone/Antarctica/Palmer.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Rothera" : { + "file" : "DateTime/TimeZone/Antarctica/Rothera.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Syowa" : { + "file" : "DateTime/TimeZone/Antarctica/Syowa.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Antarctica::Vostok" : { + "file" : "DateTime/TimeZone/Antarctica/Vostok.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Aden" : { + "file" : "DateTime/TimeZone/Asia/Aden.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Almaty" : { + "file" : "DateTime/TimeZone/Asia/Almaty.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Amman" : { + "file" : "DateTime/TimeZone/Asia/Amman.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Anadyr" : { + "file" : "DateTime/TimeZone/Asia/Anadyr.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Aqtau" : { + "file" : "DateTime/TimeZone/Asia/Aqtau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Aqtobe" : { + "file" : "DateTime/TimeZone/Asia/Aqtobe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Ashgabat" : { + "file" : "DateTime/TimeZone/Asia/Ashgabat.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Baghdad" : { + "file" : "DateTime/TimeZone/Asia/Baghdad.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Bahrain" : { + "file" : "DateTime/TimeZone/Asia/Bahrain.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Baku" : { + "file" : "DateTime/TimeZone/Asia/Baku.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Bangkok" : { + "file" : "DateTime/TimeZone/Asia/Bangkok.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Beirut" : { + "file" : "DateTime/TimeZone/Asia/Beirut.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Bishkek" : { + "file" : "DateTime/TimeZone/Asia/Bishkek.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Brunei" : { + "file" : "DateTime/TimeZone/Asia/Brunei.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Choibalsan" : { + "file" : "DateTime/TimeZone/Asia/Choibalsan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Chongqing" : { + "file" : "DateTime/TimeZone/Asia/Chongqing.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Colombo" : { + "file" : "DateTime/TimeZone/Asia/Colombo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Damascus" : { + "file" : "DateTime/TimeZone/Asia/Damascus.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Dhaka" : { + "file" : "DateTime/TimeZone/Asia/Dhaka.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Dili" : { + "file" : "DateTime/TimeZone/Asia/Dili.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Dubai" : { + "file" : "DateTime/TimeZone/Asia/Dubai.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Dushanbe" : { + "file" : "DateTime/TimeZone/Asia/Dushanbe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Gaza" : { + "file" : "DateTime/TimeZone/Asia/Gaza.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Harbin" : { + "file" : "DateTime/TimeZone/Asia/Harbin.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Hebron" : { + "file" : "DateTime/TimeZone/Asia/Hebron.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Ho_Chi_Minh" : { + "file" : "DateTime/TimeZone/Asia/Ho_Chi_Minh.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Hong_Kong" : { + "file" : "DateTime/TimeZone/Asia/Hong_Kong.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Hovd" : { + "file" : "DateTime/TimeZone/Asia/Hovd.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Irkutsk" : { + "file" : "DateTime/TimeZone/Asia/Irkutsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Jakarta" : { + "file" : "DateTime/TimeZone/Asia/Jakarta.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Jayapura" : { + "file" : "DateTime/TimeZone/Asia/Jayapura.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Jerusalem" : { + "file" : "DateTime/TimeZone/Asia/Jerusalem.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kabul" : { + "file" : "DateTime/TimeZone/Asia/Kabul.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kamchatka" : { + "file" : "DateTime/TimeZone/Asia/Kamchatka.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Karachi" : { + "file" : "DateTime/TimeZone/Asia/Karachi.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kashgar" : { + "file" : "DateTime/TimeZone/Asia/Kashgar.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kathmandu" : { + "file" : "DateTime/TimeZone/Asia/Kathmandu.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kolkata" : { + "file" : "DateTime/TimeZone/Asia/Kolkata.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Krasnoyarsk" : { + "file" : "DateTime/TimeZone/Asia/Krasnoyarsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kuala_Lumpur" : { + "file" : "DateTime/TimeZone/Asia/Kuala_Lumpur.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kuching" : { + "file" : "DateTime/TimeZone/Asia/Kuching.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Kuwait" : { + "file" : "DateTime/TimeZone/Asia/Kuwait.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Macau" : { + "file" : "DateTime/TimeZone/Asia/Macau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Magadan" : { + "file" : "DateTime/TimeZone/Asia/Magadan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Makassar" : { + "file" : "DateTime/TimeZone/Asia/Makassar.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Manila" : { + "file" : "DateTime/TimeZone/Asia/Manila.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Muscat" : { + "file" : "DateTime/TimeZone/Asia/Muscat.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Nicosia" : { + "file" : "DateTime/TimeZone/Asia/Nicosia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Novokuznetsk" : { + "file" : "DateTime/TimeZone/Asia/Novokuznetsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Novosibirsk" : { + "file" : "DateTime/TimeZone/Asia/Novosibirsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Omsk" : { + "file" : "DateTime/TimeZone/Asia/Omsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Oral" : { + "file" : "DateTime/TimeZone/Asia/Oral.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Phnom_Penh" : { + "file" : "DateTime/TimeZone/Asia/Phnom_Penh.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Pontianak" : { + "file" : "DateTime/TimeZone/Asia/Pontianak.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Pyongyang" : { + "file" : "DateTime/TimeZone/Asia/Pyongyang.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Qatar" : { + "file" : "DateTime/TimeZone/Asia/Qatar.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Qyzylorda" : { + "file" : "DateTime/TimeZone/Asia/Qyzylorda.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Rangoon" : { + "file" : "DateTime/TimeZone/Asia/Rangoon.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Riyadh" : { + "file" : "DateTime/TimeZone/Asia/Riyadh.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Sakhalin" : { + "file" : "DateTime/TimeZone/Asia/Sakhalin.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Samarkand" : { + "file" : "DateTime/TimeZone/Asia/Samarkand.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Seoul" : { + "file" : "DateTime/TimeZone/Asia/Seoul.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Shanghai" : { + "file" : "DateTime/TimeZone/Asia/Shanghai.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Singapore" : { + "file" : "DateTime/TimeZone/Asia/Singapore.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Taipei" : { + "file" : "DateTime/TimeZone/Asia/Taipei.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Tashkent" : { + "file" : "DateTime/TimeZone/Asia/Tashkent.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Tbilisi" : { + "file" : "DateTime/TimeZone/Asia/Tbilisi.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Tehran" : { + "file" : "DateTime/TimeZone/Asia/Tehran.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Thimphu" : { + "file" : "DateTime/TimeZone/Asia/Thimphu.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Tokyo" : { + "file" : "DateTime/TimeZone/Asia/Tokyo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Ulaanbaatar" : { + "file" : "DateTime/TimeZone/Asia/Ulaanbaatar.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Urumqi" : { + "file" : "DateTime/TimeZone/Asia/Urumqi.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Vientiane" : { + "file" : "DateTime/TimeZone/Asia/Vientiane.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Vladivostok" : { + "file" : "DateTime/TimeZone/Asia/Vladivostok.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Yakutsk" : { + "file" : "DateTime/TimeZone/Asia/Yakutsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Yekaterinburg" : { + "file" : "DateTime/TimeZone/Asia/Yekaterinburg.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Asia::Yerevan" : { + "file" : "DateTime/TimeZone/Asia/Yerevan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Azores" : { + "file" : "DateTime/TimeZone/Atlantic/Azores.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Bermuda" : { + "file" : "DateTime/TimeZone/Atlantic/Bermuda.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Canary" : { + "file" : "DateTime/TimeZone/Atlantic/Canary.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Cape_Verde" : { + "file" : "DateTime/TimeZone/Atlantic/Cape_Verde.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Faroe" : { + "file" : "DateTime/TimeZone/Atlantic/Faroe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Madeira" : { + "file" : "DateTime/TimeZone/Atlantic/Madeira.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Reykjavik" : { + "file" : "DateTime/TimeZone/Atlantic/Reykjavik.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::South_Georgia" : { + "file" : "DateTime/TimeZone/Atlantic/South_Georgia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::St_Helena" : { + "file" : "DateTime/TimeZone/Atlantic/St_Helena.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Atlantic::Stanley" : { + "file" : "DateTime/TimeZone/Atlantic/Stanley.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Adelaide" : { + "file" : "DateTime/TimeZone/Australia/Adelaide.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Brisbane" : { + "file" : "DateTime/TimeZone/Australia/Brisbane.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Broken_Hill" : { + "file" : "DateTime/TimeZone/Australia/Broken_Hill.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Currie" : { + "file" : "DateTime/TimeZone/Australia/Currie.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Darwin" : { + "file" : "DateTime/TimeZone/Australia/Darwin.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Eucla" : { + "file" : "DateTime/TimeZone/Australia/Eucla.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Hobart" : { + "file" : "DateTime/TimeZone/Australia/Hobart.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Lindeman" : { + "file" : "DateTime/TimeZone/Australia/Lindeman.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Lord_Howe" : { + "file" : "DateTime/TimeZone/Australia/Lord_Howe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Melbourne" : { + "file" : "DateTime/TimeZone/Australia/Melbourne.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Perth" : { + "file" : "DateTime/TimeZone/Australia/Perth.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Australia::Sydney" : { + "file" : "DateTime/TimeZone/Australia/Sydney.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::CET" : { + "file" : "DateTime/TimeZone/CET.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::CST6CDT" : { + "file" : "DateTime/TimeZone/CST6CDT.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Catalog" : { + "file" : "DateTime/TimeZone/Catalog.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::EET" : { + "file" : "DateTime/TimeZone/EET.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::EST" : { + "file" : "DateTime/TimeZone/EST.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::EST5EDT" : { + "file" : "DateTime/TimeZone/EST5EDT.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Amsterdam" : { + "file" : "DateTime/TimeZone/Europe/Amsterdam.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Andorra" : { + "file" : "DateTime/TimeZone/Europe/Andorra.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Athens" : { + "file" : "DateTime/TimeZone/Europe/Athens.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Belgrade" : { + "file" : "DateTime/TimeZone/Europe/Belgrade.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Berlin" : { + "file" : "DateTime/TimeZone/Europe/Berlin.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Brussels" : { + "file" : "DateTime/TimeZone/Europe/Brussels.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Bucharest" : { + "file" : "DateTime/TimeZone/Europe/Bucharest.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Budapest" : { + "file" : "DateTime/TimeZone/Europe/Budapest.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Chisinau" : { + "file" : "DateTime/TimeZone/Europe/Chisinau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Copenhagen" : { + "file" : "DateTime/TimeZone/Europe/Copenhagen.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Dublin" : { + "file" : "DateTime/TimeZone/Europe/Dublin.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Gibraltar" : { + "file" : "DateTime/TimeZone/Europe/Gibraltar.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Helsinki" : { + "file" : "DateTime/TimeZone/Europe/Helsinki.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Istanbul" : { + "file" : "DateTime/TimeZone/Europe/Istanbul.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Kaliningrad" : { + "file" : "DateTime/TimeZone/Europe/Kaliningrad.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Kiev" : { + "file" : "DateTime/TimeZone/Europe/Kiev.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Lisbon" : { + "file" : "DateTime/TimeZone/Europe/Lisbon.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::London" : { + "file" : "DateTime/TimeZone/Europe/London.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Luxembourg" : { + "file" : "DateTime/TimeZone/Europe/Luxembourg.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Madrid" : { + "file" : "DateTime/TimeZone/Europe/Madrid.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Malta" : { + "file" : "DateTime/TimeZone/Europe/Malta.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Minsk" : { + "file" : "DateTime/TimeZone/Europe/Minsk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Monaco" : { + "file" : "DateTime/TimeZone/Europe/Monaco.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Moscow" : { + "file" : "DateTime/TimeZone/Europe/Moscow.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Oslo" : { + "file" : "DateTime/TimeZone/Europe/Oslo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Paris" : { + "file" : "DateTime/TimeZone/Europe/Paris.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Prague" : { + "file" : "DateTime/TimeZone/Europe/Prague.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Riga" : { + "file" : "DateTime/TimeZone/Europe/Riga.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Rome" : { + "file" : "DateTime/TimeZone/Europe/Rome.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Samara" : { + "file" : "DateTime/TimeZone/Europe/Samara.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Simferopol" : { + "file" : "DateTime/TimeZone/Europe/Simferopol.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Sofia" : { + "file" : "DateTime/TimeZone/Europe/Sofia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Stockholm" : { + "file" : "DateTime/TimeZone/Europe/Stockholm.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Tallinn" : { + "file" : "DateTime/TimeZone/Europe/Tallinn.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Tirane" : { + "file" : "DateTime/TimeZone/Europe/Tirane.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Uzhgorod" : { + "file" : "DateTime/TimeZone/Europe/Uzhgorod.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Vaduz" : { + "file" : "DateTime/TimeZone/Europe/Vaduz.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Vienna" : { + "file" : "DateTime/TimeZone/Europe/Vienna.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Vilnius" : { + "file" : "DateTime/TimeZone/Europe/Vilnius.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Volgograd" : { + "file" : "DateTime/TimeZone/Europe/Volgograd.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Warsaw" : { + "file" : "DateTime/TimeZone/Europe/Warsaw.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Zaporozhye" : { + "file" : "DateTime/TimeZone/Europe/Zaporozhye.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Europe::Zurich" : { + "file" : "DateTime/TimeZone/Europe/Zurich.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Floating" : { + "file" : "DateTime/TimeZone/Floating.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::HST" : { + "file" : "DateTime/TimeZone/HST.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Antananarivo" : { + "file" : "DateTime/TimeZone/Indian/Antananarivo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Chagos" : { + "file" : "DateTime/TimeZone/Indian/Chagos.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Christmas" : { + "file" : "DateTime/TimeZone/Indian/Christmas.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Cocos" : { + "file" : "DateTime/TimeZone/Indian/Cocos.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Comoro" : { + "file" : "DateTime/TimeZone/Indian/Comoro.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Kerguelen" : { + "file" : "DateTime/TimeZone/Indian/Kerguelen.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Mahe" : { + "file" : "DateTime/TimeZone/Indian/Mahe.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Maldives" : { + "file" : "DateTime/TimeZone/Indian/Maldives.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Mauritius" : { + "file" : "DateTime/TimeZone/Indian/Mauritius.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Mayotte" : { + "file" : "DateTime/TimeZone/Indian/Mayotte.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Indian::Reunion" : { + "file" : "DateTime/TimeZone/Indian/Reunion.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Local" : { + "file" : "DateTime/TimeZone/Local.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Local::Unix" : { + "file" : "DateTime/TimeZone/Local/Unix.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Local::VMS" : { + "file" : "DateTime/TimeZone/Local/VMS.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Local::Win32" : { + "file" : "DateTime/TimeZone/Local/Win32.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::MET" : { + "file" : "DateTime/TimeZone/MET.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::MST" : { + "file" : "DateTime/TimeZone/MST.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::MST7MDT" : { + "file" : "DateTime/TimeZone/MST7MDT.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::OffsetOnly" : { + "file" : "DateTime/TimeZone/OffsetOnly.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::OlsonDB" : { + "file" : "DateTime/TimeZone/OlsonDB.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::OlsonDB::Change" : { + "file" : "DateTime/TimeZone/OlsonDB/Change.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::OlsonDB::Observance" : { + "file" : "DateTime/TimeZone/OlsonDB/Observance.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::OlsonDB::Rule" : { + "file" : "DateTime/TimeZone/OlsonDB/Rule.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::OlsonDB::Zone" : { + "file" : "DateTime/TimeZone/OlsonDB/Zone.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::PST8PDT" : { + "file" : "DateTime/TimeZone/PST8PDT.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Apia" : { + "file" : "DateTime/TimeZone/Pacific/Apia.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Auckland" : { + "file" : "DateTime/TimeZone/Pacific/Auckland.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Chatham" : { + "file" : "DateTime/TimeZone/Pacific/Chatham.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Chuuk" : { + "file" : "DateTime/TimeZone/Pacific/Chuuk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Easter" : { + "file" : "DateTime/TimeZone/Pacific/Easter.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Efate" : { + "file" : "DateTime/TimeZone/Pacific/Efate.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Enderbury" : { + "file" : "DateTime/TimeZone/Pacific/Enderbury.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Fakaofo" : { + "file" : "DateTime/TimeZone/Pacific/Fakaofo.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Fiji" : { + "file" : "DateTime/TimeZone/Pacific/Fiji.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Funafuti" : { + "file" : "DateTime/TimeZone/Pacific/Funafuti.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Galapagos" : { + "file" : "DateTime/TimeZone/Pacific/Galapagos.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Gambier" : { + "file" : "DateTime/TimeZone/Pacific/Gambier.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Guadalcanal" : { + "file" : "DateTime/TimeZone/Pacific/Guadalcanal.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Guam" : { + "file" : "DateTime/TimeZone/Pacific/Guam.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Honolulu" : { + "file" : "DateTime/TimeZone/Pacific/Honolulu.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Johnston" : { + "file" : "DateTime/TimeZone/Pacific/Johnston.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Kiritimati" : { + "file" : "DateTime/TimeZone/Pacific/Kiritimati.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Kosrae" : { + "file" : "DateTime/TimeZone/Pacific/Kosrae.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Kwajalein" : { + "file" : "DateTime/TimeZone/Pacific/Kwajalein.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Majuro" : { + "file" : "DateTime/TimeZone/Pacific/Majuro.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Marquesas" : { + "file" : "DateTime/TimeZone/Pacific/Marquesas.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Midway" : { + "file" : "DateTime/TimeZone/Pacific/Midway.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Nauru" : { + "file" : "DateTime/TimeZone/Pacific/Nauru.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Niue" : { + "file" : "DateTime/TimeZone/Pacific/Niue.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Norfolk" : { + "file" : "DateTime/TimeZone/Pacific/Norfolk.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Noumea" : { + "file" : "DateTime/TimeZone/Pacific/Noumea.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Pago_Pago" : { + "file" : "DateTime/TimeZone/Pacific/Pago_Pago.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Palau" : { + "file" : "DateTime/TimeZone/Pacific/Palau.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Pitcairn" : { + "file" : "DateTime/TimeZone/Pacific/Pitcairn.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Pohnpei" : { + "file" : "DateTime/TimeZone/Pacific/Pohnpei.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Port_Moresby" : { + "file" : "DateTime/TimeZone/Pacific/Port_Moresby.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Rarotonga" : { + "file" : "DateTime/TimeZone/Pacific/Rarotonga.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Saipan" : { + "file" : "DateTime/TimeZone/Pacific/Saipan.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Tahiti" : { + "file" : "DateTime/TimeZone/Pacific/Tahiti.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Tarawa" : { + "file" : "DateTime/TimeZone/Pacific/Tarawa.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Tongatapu" : { + "file" : "DateTime/TimeZone/Pacific/Tongatapu.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Wake" : { + "file" : "DateTime/TimeZone/Pacific/Wake.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::Pacific::Wallis" : { + "file" : "DateTime/TimeZone/Pacific/Wallis.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::UTC" : { + "file" : "DateTime/TimeZone/UTC.pm", + "version" : "1.42" + }, + "DateTime::TimeZone::WET" : { + "file" : "DateTime/TimeZone/WET.pm", + "version" : "1.42" + } + }, + "version" : "1.42" + }, + "Devel::GlobalDestruction" : { + "dist" : "Devel-GlobalDestruction-0.04", + "module" : "Devel::GlobalDestruction", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Devel-GlobalDestruction", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Sub::Exporter" : 0, + "perl" : "5.006000" + } + } + }, + "release_status" : "stable", + "version" : "0.04" + }, + "name" : "Devel::GlobalDestruction", + "pathname" : "F/FL/FLORA/Devel-GlobalDestruction-0.04.tar.gz", + "provides" : { + "Devel::GlobalDestruction" : { + "file" : "Devel/GlobalDestruction.pm", + "version" : "0.04" + } + }, + "version" : "0.04" + }, + "Devel::StackTrace" : { + "dist" : "Devel-StackTrace-1.27", + "module" : "Devel::StackTrace", + "mymeta" : { + "abstract" : "An object representing a stack trace", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200000, CPAN::Meta::Converter version 2.102400, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Devel-StackTrace", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "File::Spec" : 0, + "Scalar::Util" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Devel-StackTrace" + }, + "repository" : { + "url" : "http://hg.urth.org/hg/Devel-StackTrace" + } + }, + "version" : "1.27" + }, + "name" : "Devel::StackTrace", + "pathname" : "D/DR/DROLSKY/Devel-StackTrace-1.27.tar.gz", + "provides" : { + "Devel::StackTrace" : { + "file" : "Devel/StackTrace.pm", + "version" : "1.27" + }, + "Devel::StackTrace::Frame" : { + "file" : "Devel/StackTrace/Frame.pm", + "version" : "1.27" + } + }, + "version" : "1.27" + }, + "Digest::SHA1" : { + "dist" : "Digest-SHA1-2.13", + "module" : "Digest::SHA1", + "mymeta" : { + "abstract" : "Perl interface to the SHA-1 algorithm", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Digest-SHA1", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Digest::base" : "1.00", + "perl" : "5.004" + } + } + }, + "release_status" : "stable", + "version" : "2.13", + "x_repository" : "http://github.com/gisle/digest-sha1" + }, + "name" : "Digest::SHA1", + "pathname" : "G/GA/GAAS/Digest-SHA1-2.13.tar.gz", + "provides" : { + "Digest::SHA1" : { + "file" : "Digest/SHA1.pm", + "version" : "2.13" + } + }, + "version" : "2.13" + }, + "Dir::Self" : { + "dist" : "Dir-Self-0.10", + "module" : "Dir::Self", + "mymeta" : { + "abstract" : "a __DIR__ constant for the directory your source file is in", + "author" : [ + "Lukas Mai <l.mai @web.de>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.44, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Dir-Self", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "File::Spec" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.10" + }, + "name" : "Dir::Self", + "pathname" : "M/MA/MAUKE/Dir-Self-0.10.tar.gz", + "provides" : { + "Dir::Self" : { + "file" : "Dir/Self.pm", + "version" : "0.10" + } + }, + "version" : "0.10" + }, + "Dist::CheckConflicts" : { + "dist" : "Dist-CheckConflicts-0.02", + "module" : "Dist::CheckConflicts", + "mymeta" : { + "abstract" : "declare version conflicts for your dist", + "author" : [ + "Jesse Luehrs <doy at tozt dot net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200000, CPAN::Meta::Converter version 2.101670, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Dist-CheckConflicts", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "List::MoreUtils" : "0.12", + "Sub::Exporter" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/doy/dist-checkconflicts.git" + } + }, + "version" : "0.02", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@DOY/GatherDir", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@DOY/PruneCruft", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@DOY/ManifestSkip", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@DOY/MetaYAML", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@DOY/License", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@DOY/Readme", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@DOY/ExtraTests", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@DOY/ExecDir", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@DOY/ShareDir", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@DOY/MakeMaker", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@DOY/Manifest", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@DOY/TestRelease", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@DOY/ConfirmRelease", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@DOY/MetaConfig", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@DOY/MetaJSON", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@DOY/NextRelease", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::CheckChangesHasContent", + "name" : "@DOY/CheckChangesHasContent", + "version" : "0.003" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@DOY/PkgVersion", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@DOY/PodCoverageTests", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@DOY/PodSyntaxTests", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@DOY/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@DOY/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::CompileTests", + "name" : "@DOY/CompileTests", + "version" : "1.101800" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@DOY/Repository", + "version" : "0.13" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@DOY/Git::Check", + "version" : "1.103520" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@DOY/Git::Tag", + "version" : "1.103520" + }, + { + "class" : "Dist::Zilla::Plugin::BumpVersionFromGit", + "name" : "@DOY/BumpVersionFromGit", + "version" : "0.007" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@DOY/PodWeaver", + "version" : "3.101640" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@DOY/UploadToCPAN", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "requires" + } + }, + "name" : "Prereqs", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200000" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200000" + } + } + }, + "name" : "Dist::CheckConflicts", + "pathname" : "D/DO/DOY/Dist-CheckConflicts-0.02.tar.gz", + "provides" : { + "Dist::CheckConflicts" : { + "file" : "Dist/CheckConflicts.pm", + "version" : "0.02" + } + }, + "version" : "0.02" + }, + "Distribution::Guess::BuildSystem" : { + "dist" : "Distribution-Guess-BuildSystem-0.12", + "module" : "Distribution::Guess::BuildSystem", + "mymeta" : { + "abstract" : "This is what the module does", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Distribution-Guess-BuildSystem", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0, + "Test::Output" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.55" + } + }, + "runtime" : { + "requires" : { + "Module::Extract::Use" : 0, + "Module::Extract::VERSION" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.12" + }, + "name" : "Distribution::Guess::BuildSystem", + "pathname" : "/authors/id/B/BD/BDFOY/Distribution-Guess-BuildSystem-0.12.tar.gz", + "provides" : { + "Distribution::Guess::BuildSystem" : { + "file" : "Distribution/Guess/BuildSystem.pm", + "version" : "0.12" + } + }, + "version" : "0.12" + }, + "Email::Address" : { + "dist" : "Email-Address-1.892", + "module" : "Email::Address", + "mymeta" : { + "abstract" : "RFC 2822 Address Parsing", + "author" : [ + "Casey West <casey@geeknest.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Email-Address", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "1.892" + }, + "name" : "Email::Address", + "pathname" : "R/RJ/RJBS/Email-Address-1.892.tar.gz", + "provides" : { + "Email::Address" : { + "file" : "Email/Address.pm", + "version" : "1.892" + } + }, + "version" : "1.892" + }, + "Email::Date::Format" : { + "dist" : "Email-Date-Format-1.002", + "module" : "Email::Date::Format", + "mymeta" : { + "abstract" : "produce RFC 8822 date strings", + "author" : [ + "Ricardo SIGNES <rjbs@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.36_01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Email-Date-Format", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.47", + "Time::Local" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.002" + }, + "name" : "Email::Date::Format", + "pathname" : "R/RJ/RJBS/Email-Date-Format-1.002.tar.gz", + "provides" : { + "Email::Date::Format" : { + "file" : "Email/Date/Format.pm", + "version" : "1.002" + } + }, + "version" : "1.002" + }, + "Email::Send" : { + "dist" : "Email-Send-2.198", + "module" : "Email::Send", + "mymeta" : { + "abstract" : "Simply Sending Email", + "author" : [ + "Casey West <casey@geeknest.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Email-Send", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Email::Address" : "1.80", + "Email::Simple" : "1.92", + "File::Spec" : 0, + "Module::Pluggable" : "2.97", + "Return::Value" : "1.28", + "Scalar::Util" : "1.02", + "Symbol" : 0, + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "2.198" + }, + "name" : "Email::Send", + "pathname" : "R/RJ/RJBS/Email-Send-2.198.tar.gz", + "provides" : { + "Email::Send" : { + "file" : "Email/Send.pm", + "version" : "2.198" + }, + "Email::Send::NNTP" : { + "file" : "Email/Send/NNTP.pm", + "version" : "2.198" + }, + "Email::Send::Qmail" : { + "file" : "Email/Send/Qmail.pm", + "version" : "2.198" + }, + "Email::Send::SMTP" : { + "file" : "Email/Send/SMTP.pm", + "version" : "2.198" + }, + "Email::Send::Sendmail" : { + "file" : "Email/Send/Sendmail.pm", + "version" : "2.198" + }, + "Email::Send::Test" : { + "file" : "Email/Send/Test.pm", + "version" : "2.198" + } + }, + "version" : "2.198" + }, + "Email::Simple" : { + "dist" : "Email-Simple-2.100", + "module" : "Email::Simple", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Email-Simple", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Email::Date::Format" : 0, + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "resources" : { + "x_Repository" : "http://github.com/rjbs/email-simple" + }, + "version" : "2.100" + }, + "name" : "Email::Simple", + "pathname" : "R/RJ/RJBS/Email-Simple-2.100.tar.gz", + "provides" : { + "Email::Simple" : { + "file" : "Email/Simple.pm", + "version" : "2.100" + }, + "Email::Simple::Creator" : { + "file" : "Email/Simple/Creator.pm", + "version" : "2.100" + }, + "Email::Simple::Header" : { + "file" : "Email/Simple/Header.pm", + "version" : "2.005" + } + }, + "version" : "2.100" + }, + "Email::Valid" : { + "dist" : "Email-Valid-0.185", + "module" : "Email::Valid", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Email-Valid", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Mail::Address" : 0, + "Test::More" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/rjbs/email-valid" + } + }, + "version" : "0.185" + }, + "name" : "Email::Valid", + "pathname" : "R/RJ/RJBS/Email-Valid-0.185.tar.gz", + "provides" : { + "Email::Valid" : { + "file" : "Email/Valid.pm", + "version" : "0.185" + } + }, + "version" : "0.185" + }, + "Encode::Locale" : { + "dist" : "Encode-Locale-1.02", + "module" : "Encode::Locale", + "mymeta" : { + "abstract" : "Determine the locale encoding", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Encode-Locale", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "I18N::Langinfo" : 0, + "Win32::Console" : 0 + }, + "requires" : { + "Encode" : "2", + "Encode::Alias" : 0, + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/encode-locale" + } + }, + "version" : "1.02" + }, + "name" : "Encode::Locale", + "pathname" : "G/GA/GAAS/Encode-Locale-1.02.tar.gz", + "provides" : { + "Encode::Locale" : { + "file" : "Encode/Locale.pm", + "version" : "1.02" + } + }, + "version" : "1.02" + }, + "Eval::Closure" : { + "dist" : "Eval-Closure-0.06", + "module" : "Eval::Closure", + "mymeta" : { + "abstract" : "safely and cleanly create closures via string eval", + "author" : [ + "Jesse Luehrs <doy at tozt dot net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200006, CPAN::Meta::Converter version 2.110440, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Eval-Closure", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : 0, + "Test::More" : "0.88", + "Test::Requires" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "recommends" : { + "Perl::Tidy" : 0 + }, + "requires" : { + "Scalar::Util" : 0, + "Sub::Exporter" : 0, + "Try::Tiny" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/doy/eval-closure.git" + } + }, + "version" : "0.06", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@DOY/TestMoreDoneTesting", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@DOY/GatherDir", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@DOY/PruneCruft", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@DOY/ManifestSkip", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@DOY/MetaYAML", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@DOY/License", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@DOY/Readme", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@DOY/ExtraTests", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@DOY/ExecDir", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@DOY/ShareDir", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@DOY/MakeMaker", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@DOY/Manifest", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@DOY/TestRelease", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@DOY/ConfirmRelease", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@DOY/MetaConfig", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@DOY/MetaJSON", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@DOY/NextRelease", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::CheckChangesHasContent", + "name" : "@DOY/CheckChangesHasContent", + "version" : "0.003" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@DOY/PkgVersion", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@DOY/PodCoverageTests", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@DOY/PodSyntaxTests", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@DOY/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@DOY/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::CompileTests", + "name" : "@DOY/CompileTests", + "version" : "1.110930" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@DOY/Repository", + "version" : "0.18" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@DOY/Git::Check", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@DOY/Git::Tag", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@DOY/Git::NextVersion", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@DOY/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@DOY/UploadToCPAN", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "requires" + } + }, + "name" : "Prereqs", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "recommends" + } + }, + "name" : "RuntimeRecommends", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200006" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "4.200006" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200006" + } + } + }, + "name" : "Eval::Closure", + "pathname" : "D/DO/DOY/Eval-Closure-0.06.tar.gz", + "provides" : { + "Eval::Closure" : { + "file" : "Eval/Closure.pm", + "version" : "0.06" + } + }, + "version" : "0.06" + }, + "Exception::Class" : { + "dist" : "Exception-Class-1.32", + "module" : "Exception::Class", + "mymeta" : { + "abstract" : "A module that allows you to declare real exception classes in Perl", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.101740, CPAN::Meta::Converter version 2.101670, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Exception-Class", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "Class::Data::Inheritable" : "0.02", + "Devel::StackTrace" : "1.20", + "Scalar::Util" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Exception-Class" + }, + "repository" : { + "url" : "http://hg.urth.org/hg/Exception-Class" + } + }, + "version" : "1.32" + }, + "name" : "Exception::Class", + "pathname" : "D/DR/DROLSKY/Exception-Class-1.32.tar.gz", + "provides" : { + "Exception::Class" : { + "file" : "Exception/Class.pm", + "version" : "1.32" + }, + "Exception::Class::Base" : { + "file" : "Exception/Class/Base.pm", + "version" : "1.32" + } + }, + "version" : "1.32" + }, + "ExtUtils::MakeMaker" : { + "dist" : "ExtUtils-MakeMaker-6.62", + "module" : "ExtUtils::MakeMaker", + "mymeta" : { + "abstract" : "Create a module Makefile", + "author" : [ + "Michael G Schwern <schwern@pobox.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "ExtUtils-MakeMaker", + "no_index" : { + "directory" : [ + "t", + "inc", + "bundled", + "my" + ], + "package" : [ + "DynaLoader", + "in" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Data::Dumper" : 0 + } + }, + "configure" : { + "requires" : {} + }, + "runtime" : { + "requires" : { + "DirHandle" : 0, + "File::Basename" : 0, + "File::Spec" : "0.8", + "Pod::Man" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker" + }, + "homepage" : "http://makemaker.org", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker" + }, + "x_MailingList" : "makemaker@perl.org" + }, + "version" : "6.62" + }, + "name" : "ExtUtils::MakeMaker", + "pathname" : "M/MS/MSCHWERN/ExtUtils-MakeMaker-6.62.tar.gz", + "provides" : { + "DynaLoader" : { + "file" : "ExtUtils/Mkbootstrap.pm" + }, + "ExtUtils::Command::MM" : { + "file" : "ExtUtils/Command/MM.pm", + "version" : "6.62" + }, + "ExtUtils::Liblist" : { + "file" : "ExtUtils/Liblist.pm", + "version" : "6.62" + }, + "ExtUtils::Liblist::Kid" : { + "file" : "ExtUtils/Liblist/Kid.pm", + "version" : "6.62" + }, + "ExtUtils::MM" : { + "file" : "ExtUtils/MM.pm", + "version" : "6.62" + }, + "ExtUtils::MM_AIX" : { + "file" : "ExtUtils/MM_AIX.pm", + "version" : "6.62" + }, + "ExtUtils::MM_Any" : { + "file" : "ExtUtils/MM_Any.pm", + "version" : "6.62" + }, + "ExtUtils::MM_BeOS" : { + "file" : "ExtUtils/MM_BeOS.pm", + "version" : "6.62" + }, + "ExtUtils::MM_Cygwin" : { + "file" : "ExtUtils/MM_Cygwin.pm", + "version" : "6.62" + }, + "ExtUtils::MM_DOS" : { + "file" : "ExtUtils/MM_DOS.pm", + "version" : "6.62" + }, + "ExtUtils::MM_Darwin" : { + "file" : "ExtUtils/MM_Darwin.pm", + "version" : "6.62" + }, + "ExtUtils::MM_MacOS" : { + "file" : "ExtUtils/MM_MacOS.pm", + "version" : "6.62" + }, + "ExtUtils::MM_NW5" : { + "file" : "ExtUtils/MM_NW5.pm", + "version" : "6.62" + }, + "ExtUtils::MM_OS2" : { + "file" : "ExtUtils/MM_OS2.pm", + "version" : "6.62" + }, + "ExtUtils::MM_QNX" : { + "file" : "ExtUtils/MM_QNX.pm", + "version" : "6.62" + }, + "ExtUtils::MM_UWIN" : { + "file" : "ExtUtils/MM_UWIN.pm", + "version" : "6.62" + }, + "ExtUtils::MM_Unix" : { + "file" : "ExtUtils/MM_Unix.pm", + "version" : "6.62" + }, + "ExtUtils::MM_VMS" : { + "file" : "ExtUtils/MM_VMS.pm", + "version" : "6.62" + }, + "ExtUtils::MM_VOS" : { + "file" : "ExtUtils/MM_VOS.pm", + "version" : "6.62" + }, + "ExtUtils::MM_Win32" : { + "file" : "ExtUtils/MM_Win32.pm", + "version" : "6.62" + }, + "ExtUtils::MM_Win95" : { + "file" : "ExtUtils/MM_Win95.pm", + "version" : "6.62" + }, + "ExtUtils::MY" : { + "file" : "ExtUtils/MY.pm", + "version" : "6.62" + }, + "ExtUtils::MakeMaker" : { + "file" : "ExtUtils/MakeMaker.pm", + "version" : "6.62" + }, + "ExtUtils::MakeMaker::Config" : { + "file" : "ExtUtils/MakeMaker/Config.pm", + "version" : "6.62" + }, + "ExtUtils::Mkbootstrap" : { + "file" : "ExtUtils/Mkbootstrap.pm", + "version" : "6.62" + }, + "ExtUtils::Mksymlists" : { + "file" : "ExtUtils/Mksymlists.pm", + "version" : "6.62" + }, + "ExtUtils::testlib" : { + "file" : "ExtUtils/testlib.pm", + "version" : "6.62" + }, + "MM" : { + "file" : "ExtUtils/MM.pm" + }, + "MY" : { + "file" : "ExtUtils/MakeMaker.pm" + } + }, + "version" : "6.62" + }, + "FCGI" : { + "dist" : "FCGI-0.74", + "module" : "FCGI", + "mymeta" : { + "abstract" : "Fast CGI module", + "author" : [ + "Sven Verdoolaege (skimo@kotnet.org)" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "FCGI", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/catagits/fcgi2.git" + } + }, + "version" : "0.74" + }, + "name" : "FCGI", + "pathname" : "F/FL/FLORA/FCGI-0.74.tar.gz", + "provides" : { + "FCGI" : { + "file" : "FCGI.pm", + "version" : "0.74" + }, + "FCGI::Stream" : { + "file" : "FCGI.pm" + } + }, + "version" : "0.74" + }, + "File::Find::Closures" : { + "dist" : "File-Find-Closures-1.09", + "module" : "File::Find::Closures", + "mymeta" : { + "abstract" : "functions you can use with File::Find", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.44, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "File-Find-Closures", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "File::Find" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.09" + }, + "name" : "File::Find::Closures", + "pathname" : "/authors/id/B/BD/BDFOY/File-Find-Closures-1.09.tar.gz", + "provides" : { + "File::Find::Closures" : { + "file" : "File/Find/Closures.pm", + "version" : "1.09" + } + }, + "version" : "1.09" + }, + "File::Find::Rule" : { + "dist" : "File-Find-Rule-0.33", + "module" : "File::Find::Rule", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "File-Find-Rule", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "File::Find" : 0, + "File::Spec" : 0, + "Number::Compare" : 0, + "Test::More" : 0, + "Text::Glob" : "0.07" + } + } + }, + "release_status" : "stable", + "version" : "0.33" + }, + "name" : "File::Find::Rule", + "pathname" : "R/RC/RCLAMP/File-Find-Rule-0.33.tar.gz", + "provides" : { + "File::Find::Rule" : { + "file" : "File/Find/Rule.pm", + "version" : "0.33" + } + }, + "version" : "0.33" + }, + "File::Listing" : { + "dist" : "File-Listing-6.03", + "module" : "File::Listing", + "mymeta" : { + "abstract" : "parse directory listing", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "File-Listing", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "HTTP::Date" : "6", + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl/tree/File-Listing/master" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.03" + }, + "name" : "File::Listing", + "pathname" : "G/GA/GAAS/File-Listing-6.03.tar.gz", + "provides" : { + "File::Listing" : { + "file" : "File/Listing.pm", + "version" : "6.03" + }, + "File::Listing::apache" : { + "file" : "File/Listing.pm" + }, + "File::Listing::dosftp" : { + "file" : "File/Listing.pm" + }, + "File::Listing::netware" : { + "file" : "File/Listing.pm" + }, + "File::Listing::unix" : { + "file" : "File/Listing.pm" + }, + "File::Listing::vms" : { + "file" : "File/Listing.pm" + } + }, + "version" : "6.03" + }, + "File::Remove" : { + "dist" : "File-Remove-1.48", + "module" : "File::Remove", + "mymeta" : { + "abstract" : "Remove files and directories", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "File-Remove", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : "0.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Cwd" : "3.2701", + "File::Spec" : "3.2701", + "perl" : "5.00503" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/File-Remove" + }, + "x_ChangeLog" : "http://fisheye2.atlassian.com/changelog/cpan/trunk/File-Remove" + }, + "version" : "1.48", + "x_module_name" : "File::Remove" + }, + "name" : "File::Remove", + "pathname" : "/authors/id/A/AD/ADAMK/File-Remove-1.48.tar.gz", + "provides" : { + "File::Remove" : { + "file" : "File/Remove.pm", + "version" : "1.48" + } + }, + "version" : "1.48" + }, + "File::Slurp" : { + "dist" : "File-Slurp-9999.19", + "module" : "File::Slurp", + "mymeta" : { + "abstract" : "Simple and Efficient Reading/Writing/Modifying of Complete Files", + "author" : [ + "Uri Guttman <uri@stemsystems.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.42, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "File-Slurp", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Exporter" : 0, + "Fcntl" : 0, + "POSIX" : 0 + } + } + }, + "release_status" : "stable", + "version" : "9999.19" + }, + "name" : "File::Slurp", + "pathname" : "U/UR/URI/File-Slurp-9999.19.tar.gz", + "provides" : { + "File::Slurp" : { + "file" : "File/Slurp.pm", + "version" : "9999.19" + } + }, + "version" : "9999.19" + }, + "Geography::NationalGrid" : { + "dist" : "Geography-NationalGrid-1.6", + "module" : "Geography::NationalGrid", + "mymeta" : { + "abstract" : "Convert national grid references to/from lat/long", + "author" : [ + "P Kent (pause@selsyn.co.uk)" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Geography-NationalGrid", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.6" + }, + "name" : "Geography::NationalGrid", + "pathname" : "http:/backpan.perl.org/authors/id/P/PK/PKENT/Geography-NationalGrid-1.6.tar.gz", + "provides" : { + "Geography::NationalGrid" : { + "file" : "Geography/NationalGrid.pm", + "version" : "1.6" + }, + "Geography::NationalGrid::GB" : { + "file" : "Geography/NationalGrid/GB.pm", + "version" : "1.3" + }, + "Geography::NationalGrid::IE" : { + "file" : "Geography/NationalGrid/IE.pm", + "version" : "1.2" + } + }, + "version" : "1.6" + }, + "Getopt::Long::Descriptive" : { + "dist" : "Getopt-Long-Descriptive-0.090", + "module" : "Getopt::Long::Descriptive", + "mymeta" : { + "abstract" : "Getopt::Long, but simpler and more powerful", + "author" : [ + "Hans Dieter Pearcey <hdp@cpan.org>", + "Ricardo Signes <rjbs@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200005, CPAN::Meta::Converter version 2.110930, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Getopt-Long-Descriptive", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.96" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "File::Basename" : 0, + "Getopt::Long" : "2.33", + "List::Util" : 0, + "Params::Validate" : "0.97", + "Scalar::Util" : 0, + "Sub::Exporter" : "0.972", + "Sub::Exporter::Util" : 0, + "overload" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://git.codesimply.com/Getopt-Long-Descriptive.git" + } + }, + "version" : "0.090", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", + "name" : "@RJBS/CheckPrereqsIndexed", + "version" : "0.002" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@RJBS/@Basic/GatherDir", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@RJBS/@Basic/PruneCruft", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@RJBS/@Basic/ManifestSkip", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@RJBS/@Basic/MetaYAML", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@RJBS/@Basic/License", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@RJBS/@Basic/Readme", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@RJBS/@Basic/ExtraTests", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@RJBS/@Basic/ExecDir", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@RJBS/@Basic/ShareDir", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@RJBS/@Basic/MakeMaker", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@RJBS/@Basic/Manifest", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@RJBS/@Basic/TestRelease", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@RJBS/@Basic/ConfirmRelease", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@RJBS/@Basic/UploadToCPAN", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@RJBS/AutoPrereqs", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@RJBS/Git::NextVersion", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@RJBS/PkgVersion", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@RJBS/MetaConfig", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@RJBS/MetaJSON", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@RJBS/NextRelease", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@RJBS/PodSyntaxTests", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@RJBS/Repository", + "version" : "0.17" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@RJBS/TestMoreWithSubtests", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@RJBS/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@RJBS/@Git/Check", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "name" : "@RJBS/@Git/Commit", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@RJBS/@Git/Tag", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "name" : "@RJBS/@Git/Push", + "version" : "1.110500" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200005" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200005" + } + } + }, + "name" : "Getopt::Long::Descriptive", + "pathname" : "R/RJ/RJBS/Getopt-Long-Descriptive-0.090.tar.gz", + "provides" : { + "Getopt::Long::Descriptive" : { + "file" : "Getopt/Long/Descriptive.pm", + "version" : "0.090" + }, + "Getopt::Long::Descriptive::Opts" : { + "file" : "Getopt/Long/Descriptive/Opts.pm", + "version" : "0.090" + }, + "Getopt::Long::Descriptive::Usage" : { + "file" : "Getopt/Long/Descriptive/Usage.pm", + "version" : "0.090" + } + }, + "version" : "0.090" + }, + "HTML::Form" : { + "dist" : "HTML-Form-6.00", + "module" : "HTML::Form", + "mymeta" : { + "abstract" : "Class that represents an HTML form element", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTML-Form", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Encode" : "2", + "HTML::TokeParser" : 0, + "HTTP::Request" : "6", + "HTTP::Request::Common" : "6", + "URI" : "1.10", + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.00" + }, + "name" : "HTML::Form", + "pathname" : "G/GA/GAAS/HTML-Form-6.00.tar.gz", + "provides" : { + "HTML::Form" : { + "file" : "HTML/Form.pm", + "version" : "6.00" + }, + "HTML::Form::FileInput" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::IgnoreInput" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::ImageInput" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::Input" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::KeygenInput" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::ListInput" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::SubmitInput" : { + "file" : "HTML/Form.pm" + }, + "HTML::Form::TextInput" : { + "file" : "HTML/Form.pm" + } + }, + "version" : "6.00" + }, + "HTML::Parser" : { + "dist" : "HTML-Parser-3.69", + "module" : "HTML::Parser", + "mymeta" : { + "abstract" : "HTML parser class", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTML-Parser", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "HTTP::Headers" : 0 + }, + "requires" : { + "HTML::Tagset" : "3", + "XSLoader" : 0, + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/html-parser" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "3.69" + }, + "name" : "HTML::Parser", + "pathname" : "G/GA/GAAS/HTML-Parser-3.69.tar.gz", + "provides" : { + "HTML::Entities" : { + "file" : "HTML/Entities.pm", + "version" : "3.69" + }, + "HTML::Filter" : { + "file" : "HTML/Filter.pm", + "version" : "3.57" + }, + "HTML::HeadParser" : { + "file" : "HTML/HeadParser.pm", + "version" : "3.69" + }, + "HTML::LinkExtor" : { + "file" : "HTML/LinkExtor.pm", + "version" : "3.69" + }, + "HTML::Parser" : { + "file" : "HTML/Parser.pm", + "version" : "3.69" + }, + "HTML::PullParser" : { + "file" : "HTML/PullParser.pm", + "version" : "3.57" + }, + "HTML::TokeParser" : { + "file" : "HTML/TokeParser.pm", + "version" : "3.69" + } + }, + "version" : "3.69" + }, + "HTML::Selector::XPath" : { + "dist" : "HTML-Selector-XPath-0.12", + "module" : "HTML::Selector::XPath", + "mymeta" : { + "abstract" : "CSS Selector to XPath compiler", + "author" : [ + "Tatsuhiko Miyagawa <miyagawa@bulknews.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.81, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTML-Selector-XPath", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.50" + } + }, + "runtime" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.62", + "Test::Base" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.12" + }, + "name" : "HTML::Selector::XPath", + "pathname" : "C/CO/CORION/HTML-Selector-XPath-0.12.tar.gz", + "provides" : { + "HTML::Selector::XPath" : { + "file" : "HTML/Selector/XPath.pm", + "version" : "0.12" + } + }, + "version" : "0.12" + }, + "HTML::Tagset" : { + "dist" : "HTML-Tagset-3.20", + "module" : "HTML::Tagset", + "mymeta" : { + "abstract" : "data tables useful in parsing HTML", + "author" : [ + "Andy Lester <andy@petdance.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.42, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTML-Tagset", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "3.20" + }, + "name" : "HTML::Tagset", + "pathname" : "P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz", + "provides" : { + "HTML::Tagset" : { + "file" : "HTML/Tagset.pm", + "version" : "3.20" + } + }, + "version" : "3.20" + }, + "HTML::Tree" : { + "dist" : "HTML-Tree-4.2", + "module" : "HTML::TreeBuilder", + "mymeta" : { + "abstract" : "Class for objects that represent HTML elements", + "author" : [ + "Jeff Fearn <jfearn@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTML-Tree", + "prereqs" : { + "build" : { + "requires" : { + "HTML::Parser" : "3.46", + "HTML::Tagset" : "3.02", + "Module::Build" : 0, + "Test::Exception" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "HTML::Parser" : "3.46", + "HTML::Tagset" : "3.02", + "perl" : "v5.8.0" + } + } + }, + "provides" : { + "HTML::AsSubs" : { + "file" : "lib/HTML/AsSubs.pm", + "version" : "4.2" + }, + "HTML::Element" : { + "file" : "lib/HTML/Element.pm", + "version" : "4.2" + }, + "HTML::Element::traverse" : { + "file" : "lib/HTML/Element/traverse.pm", + "version" : "4.2" + }, + "HTML::Parse" : { + "file" : "lib/HTML/Parse.pm", + "version" : "4.2" + }, + "HTML::Tree" : { + "file" : "lib/HTML/Tree.pm", + "version" : "4.2" + }, + "HTML::TreeBuilder" : { + "file" : "lib/HTML/TreeBuilder.pm", + "version" : "4.2" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "4.2" + }, + "name" : "HTML::Tree", + "pathname" : "J/JF/JFEARN/HTML-Tree-4.2.tar.gz", + "provides" : { + "HTML::AsSubs" : { + "file" : "HTML/AsSubs.pm", + "version" : "4.2" + }, + "HTML::Element" : { + "file" : "HTML/Element.pm", + "version" : "4.2" + }, + "HTML::Element::traverse" : { + "file" : "HTML/Element/traverse.pm", + "version" : "4.2" + }, + "HTML::Parse" : { + "file" : "HTML/Parse.pm", + "version" : "4.2" + }, + "HTML::Tree" : { + "file" : "HTML/Tree.pm", + "version" : "4.2" + }, + "HTML::TreeBuilder" : { + "file" : "HTML/TreeBuilder.pm", + "version" : "4.2" + } + }, + "version" : "4.2" + }, + "HTML::TreeBuilder::XPath" : { + "dist" : "HTML-TreeBuilder-XPath-0.14", + "module" : "HTML::TreeBuilder::XPath", + "mymeta" : { + "abstract" : "add XPath support to HTML::TreeBuilder", + "author" : [ + "Michel Rodriguez <mrodrigu@localdomain>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.58, CPAN::Meta::Converter version 2.110930001, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTML-TreeBuilder-XPath", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "HTML::TreeBuilder" : 0, + "List::Util" : 0, + "XML::XPathEngine" : "0.12" + } + } + }, + "release_status" : "stable", + "version" : "0.14" + }, + "name" : "HTML::TreeBuilder::XPath", + "pathname" : "M/MI/MIROD/HTML-TreeBuilder-XPath-0.14.tar.gz", + "provides" : { + "HTML::Element" : { + "file" : "HTML/TreeBuilder/XPath.pm" + }, + "HTML::TreeBuilder::XPath" : { + "file" : "HTML/TreeBuilder/XPath.pm", + "version" : "0.14" + }, + "HTML::TreeBuilder::XPath::Attribute" : { + "file" : "HTML/TreeBuilder/XPath.pm" + }, + "HTML::TreeBuilder::XPath::Node" : { + "file" : "HTML/TreeBuilder/XPath.pm" + }, + "HTML::TreeBuilder::XPath::Root" : { + "file" : "HTML/TreeBuilder/XPath.pm" + }, + "HTML::TreeBuilder::XPath::TextNode" : { + "file" : "HTML/TreeBuilder/XPath.pm" + } + }, + "version" : "0.14" + }, + "HTTP::Body" : { + "dist" : "HTTP-Body-1.15", + "module" : "HTTP::Body", + "mymeta" : { + "abstract" : "HTTP Body Parser", + "author" : [ + "Christian Hansen, C<chansen@cpan.org>", + "Sebastian Riedel, C<sri@cpan.org>", + "Andy Grundman, C<andy@hybridized.org>", + "Torsten Raudssus, C<getty@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300003, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Body", + "prereqs" : { + "build" : { + "requires" : { + "Test::Deep" : 0, + "Test::More" : "0.86" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Digest::MD5" : 0, + "File::Temp" : "0.14", + "HTTP::Headers" : 0, + "IO::File" : "1.14" + } + } + }, + "release_status" : "stable", + "resources" : { + "X_mailing_list" : "http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev", + "repository" : { + "url" : "https://dev.catalystframework.org/repos/Catalyst/trunk/HTTP-Body/" + } + }, + "version" : "1.15" + }, + "name" : "HTTP::Body", + "pathname" : "G/GE/GETTY/HTTP-Body-1.15.tar.gz", + "provides" : { + "HTTP::Body" : { + "file" : "HTTP/Body.pm", + "version" : "1.15" + }, + "HTTP::Body::MultiPart" : { + "file" : "HTTP/Body/MultiPart.pm", + "version" : "1.15" + }, + "HTTP::Body::OctetStream" : { + "file" : "HTTP/Body/OctetStream.pm", + "version" : "1.15" + }, + "HTTP::Body::UrlEncoded" : { + "file" : "HTTP/Body/UrlEncoded.pm", + "version" : "1.15" + }, + "HTTP::Body::XForms" : { + "file" : "HTTP/Body/XForms.pm", + "version" : "1.15" + }, + "HTTP::Body::XFormsMultipart" : { + "file" : "HTTP/Body/XFormsMultipart.pm", + "version" : "1.15" + } + }, + "version" : "1.15" + }, + "HTTP::Cookies" : { + "dist" : "HTTP-Cookies-6.00", + "module" : "HTTP::Cookies", + "mymeta" : { + "abstract" : "HTTP cookie jars", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Cookies", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "HTTP::Date" : "6", + "HTTP::Headers::Util" : "6", + "Time::Local" : 0, + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.00" + }, + "name" : "HTTP::Cookies", + "pathname" : "G/GA/GAAS/HTTP-Cookies-6.00.tar.gz", + "provides" : { + "HTTP::Cookies" : { + "file" : "HTTP/Cookies.pm", + "version" : "6.00" + }, + "HTTP::Cookies::Microsoft" : { + "file" : "HTTP/Cookies/Microsoft.pm", + "version" : "6.00" + }, + "HTTP::Cookies::Netscape" : { + "file" : "HTTP/Cookies/Netscape.pm", + "version" : "6.00" + } + }, + "version" : "6.00" + }, + "HTTP::Daemon" : { + "dist" : "HTTP-Daemon-6.00", + "module" : "HTTP::Daemon", + "mymeta" : { + "abstract" : "a simple http server class", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Daemon", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "HTTP::Date" : "6", + "HTTP::Request" : "6", + "HTTP::Response" : "6", + "HTTP::Status" : "6", + "IO::Socket" : 0, + "LWP::MediaTypes" : "6", + "Sys::Hostname" : 0, + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.00" + }, + "name" : "HTTP::Daemon", + "pathname" : "G/GA/GAAS/HTTP-Daemon-6.00.tar.gz", + "provides" : { + "HTTP::Daemon" : { + "file" : "HTTP/Daemon.pm", + "version" : "6.00" + }, + "HTTP::Daemon::ClientConn" : { + "file" : "HTTP/Daemon.pm" + } + }, + "version" : "6.00" + }, + "HTTP::Date" : { + "dist" : "HTTP-Date-6.00", + "module" : "HTTP::Date", + "mymeta" : { + "abstract" : "date conversion routines", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Date", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "Time::Zone" : 0 + }, + "requires" : { + "Time::Local" : 0, + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.00" + }, + "name" : "HTTP::Date", + "pathname" : "G/GA/GAAS/HTTP-Date-6.00.tar.gz", + "provides" : { + "HTTP::Date" : { + "file" : "HTTP/Date.pm", + "version" : "6.00" + } + }, + "version" : "6.00" + }, + "HTTP::Message" : { + "dist" : "HTTP-Message-6.02", + "module" : "HTTP::Status", + "mymeta" : { + "abstract" : "HTTP style messages", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Message", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Compress::Raw::Zlib" : 0, + "Encode" : "2.12", + "Encode::Locale" : "1", + "HTML::Parser" : "3.33", + "HTTP::Date" : "6", + "IO::Compress::Bzip2" : "2.021", + "IO::Compress::Deflate" : 0, + "IO::Compress::Gzip" : 0, + "IO::Uncompress::Bunzip2" : "2.021", + "IO::Uncompress::Gunzip" : 0, + "IO::Uncompress::Inflate" : 0, + "IO::Uncompress::RawInflate" : 0, + "LWP::MediaTypes" : "6", + "MIME::Base64" : "2.1", + "MIME::QuotedPrint" : 0, + "URI" : "1.10", + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl/tree/HTTP-Message/master" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.02" + }, + "name" : "HTTP::Message", + "pathname" : "G/GA/GAAS/HTTP-Message-6.02.tar.gz", + "provides" : { + "HTTP::Config" : { + "file" : "HTTP/Config.pm", + "version" : "6.00" + }, + "HTTP::Headers" : { + "file" : "HTTP/Headers.pm", + "version" : "6.00" + }, + "HTTP::Headers::Auth" : { + "file" : "HTTP/Headers/Auth.pm", + "version" : "6.00" + }, + "HTTP::Headers::ETag" : { + "file" : "HTTP/Headers/ETag.pm", + "version" : "6.00" + }, + "HTTP::Headers::Util" : { + "file" : "HTTP/Headers/Util.pm", + "version" : "6.00" + }, + "HTTP::Message" : { + "file" : "HTTP/Message.pm", + "version" : "6.02" + }, + "HTTP::Request" : { + "file" : "HTTP/Request.pm", + "version" : "6.00" + }, + "HTTP::Request::Common" : { + "file" : "HTTP/Request/Common.pm", + "version" : "6.00" + }, + "HTTP::Response" : { + "file" : "HTTP/Response.pm", + "version" : "6.01" + }, + "HTTP::Status" : { + "file" : "HTTP/Status.pm", + "version" : "6.00" + } + }, + "version" : "6.00" + }, + "HTTP::Negotiate" : { + "dist" : "HTTP-Negotiate-6.00", + "module" : "HTTP::Negotiate", + "mymeta" : { + "abstract" : "choose a variant to serve", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Negotiate", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "HTTP::Headers" : "6", + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.00" + }, + "name" : "HTTP::Negotiate", + "pathname" : "G/GA/GAAS/HTTP-Negotiate-6.00.tar.gz", + "provides" : { + "HTTP::Negotiate" : { + "file" : "HTTP/Negotiate.pm", + "version" : "6.00" + } + }, + "version" : "6.00" + }, + "HTTP::Request::AsCGI" : { + "dist" : "HTTP-Request-AsCGI-1.2", + "module" : "HTTP::Request::AsCGI", + "mymeta" : { + "abstract" : "Set up a CGI environment from an HTTP::Request", + "author" : [ + "Christian Hansen <ch@ngmedia.com>", + "Hans Dieter Pearcey <hdp@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 1.093400, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Request-AsCGI", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Class::Accessor" : 0, + "HTTP::Request" : 0, + "HTTP::Response" : "1.53", + "IO::File" : 0, + "Test::More" : 0, + "URI::Escape" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/HTTP-Request-AsCGI" + } + }, + "version" : "1.2" + }, + "name" : "HTTP::Request::AsCGI", + "pathname" : "F/FL/FLORA/HTTP-Request-AsCGI-1.2.tar.gz", + "provides" : { + "HTTP::Request::AsCGI" : { + "file" : "HTTP/Request/AsCGI.pm", + "version" : "1.2" + } + }, + "version" : "1.2" + }, + "HTTP::Server::Simple" : { + "dist" : "HTTP-Server-Simple-0.44", + "module" : "HTTP::Server::Simple", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "HTTP-Server-Simple", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "CGI" : 0, + "Socket" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.44" + }, + "name" : "HTTP::Server::Simple", + "pathname" : "J/JE/JESSE/HTTP-Server-Simple-0.44.tar.gz", + "provides" : { + "HTTP::Server::Simple" : { + "file" : "HTTP/Server/Simple.pm", + "version" : "0.44" + }, + "HTTP::Server::Simple::CGI" : { + "file" : "HTTP/Server/Simple/CGI.pm", + "version" : "0" + }, + "HTTP::Server::Simple::CGI::Environment" : { + "file" : "HTTP/Server/Simple/CGI/Environment.pm", + "version" : "0" + } + }, + "version" : "0.44" + }, + "Hash::Merge" : { + "dist" : "Hash-Merge-0.12", + "module" : "Hash::Merge", + "mymeta" : { + "abstract" : "Merges arbitrarily deep hashes into a single hash", + "author" : [ + "Michael K. Neylon <mneylon-pm@masemware.com" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Hash-Merge", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Clone" : 0, + "Test::More" : "0.33" + } + } + }, + "release_status" : "stable", + "version" : "0.12" + }, + "name" : "Hash::Merge", + "pathname" : "D/DM/DMUEY/Hash-Merge-0.12.tar.gz", + "provides" : { + "Hash::Merge" : { + "file" : "Hash/Merge.pm", + "version" : "0.12" + } + }, + "version" : "0.12" + }, + "Hook::LexWrap" : { + "dist" : "Hook-LexWrap-0.24", + "module" : "Hook::LexWrap", + "mymeta" : { + "abstract" : "Lexically scoped subroutine wrappers", + "author" : [ + "Damian Conway (damian@conway.org)" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Hook-LexWrap", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "runtime" : { + "requires" : { + "perl" : "5.006" + } + } + }, + "provides" : { + "Hook::LexWrap" : { + "file" : "lib/Hook/LexWrap.pm", + "version" : "0.24" + }, + "Hook::LexWrap::Cleanup" : { + "file" : "lib/Hook/LexWrap.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/chorny/Hook-LexWrap" + } + }, + "version" : "0.24" + }, + "name" : "Hook::LexWrap", + "pathname" : "/authors/id/C/CH/CHORNY/Hook-LexWrap-0.24.tar.gz", + "provides" : { + "Hook::LexWrap" : { + "file" : "Hook/LexWrap.pm", + "version" : "0.24" + }, + "Hook::LexWrap::Cleanup" : { + "file" : "Hook/LexWrap.pm" + } + }, + "version" : "0.24" + }, + "IO::String" : { + "dist" : "IO-String-1.08", + "module" : "IO::String", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "IO-String", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.08" + }, + "name" : "IO::String", + "pathname" : "G/GA/GAAS/IO-String-1.08.tar.gz", + "provides" : { + "IO::String" : { + "file" : "IO/String.pm", + "version" : "1.08" + } + }, + "version" : "1.08" + }, + "IO::Stringy" : { + "dist" : "IO-stringy-2.110", + "module" : "IO::Scalar", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "IO-stringy", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "2.110" + }, + "name" : "IO::Stringy", + "pathname" : "D/DS/DSKOLL/IO-stringy-2.110.tar.gz", + "provides" : { + "IO::AtomicFile" : { + "file" : "IO/AtomicFile.pm", + "version" : "2.110" + }, + "IO::InnerFile" : { + "file" : "IO/InnerFile.pm", + "version" : "2.110" + }, + "IO::Lines" : { + "file" : "IO/Lines.pm", + "version" : "2.110" + }, + "IO::Scalar" : { + "file" : "IO/Scalar.pm", + "version" : "2.110" + }, + "IO::ScalarArray" : { + "file" : "IO/ScalarArray.pm", + "version" : "2.110" + }, + "IO::Stringy" : { + "file" : "IO/Stringy.pm", + "version" : "2.110" + }, + "IO::Wrap" : { + "file" : "IO/Wrap.pm", + "version" : "2.110" + }, + "IO::WrapTie" : { + "file" : "IO/WrapTie.pm", + "version" : "2.110" + }, + "IO::WrapTie::Master" : { + "file" : "IO/WrapTie.pm" + }, + "IO::WrapTie::Slave" : { + "file" : "IO/WrapTie.pm" + } + }, + "version" : "2.110" + }, + "IPC::Run3" : { + "dist" : "IPC-Run3-0.044", + "module" : "IPC::Run3", + "mymeta" : { + "abstract" : "run a subprocess with input/ouput redirection", + "author" : [ + "Barrie Slaymaker <barries@slaysys.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "open_source" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "IPC-Run3", + "no_index" : { + "directory" : [ + "lib/IPC/Run3" + ], + "file" : [ + "bin/run3profpp" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.31", + "Time::HiRes" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/rjbs/ipc-run3/" + } + }, + "version" : "0.044" + }, + "name" : "IPC::Run3", + "pathname" : "R/RJ/RJBS/IPC-Run3-0.044.tar.gz", + "provides" : { + "IPC::Run3" : { + "file" : "IPC/Run3.pm", + "version" : "0.044" + }, + "IPC::Run3::ProfArrayBuffer" : { + "file" : "IPC/Run3/ProfArrayBuffer.pm", + "version" : "0.044" + }, + "IPC::Run3::ProfLogReader" : { + "file" : "IPC/Run3/ProfLogReader.pm", + "version" : "0.044" + }, + "IPC::Run3::ProfLogger" : { + "file" : "IPC/Run3/ProfLogger.pm", + "version" : "0.044" + }, + "IPC::Run3::ProfPP" : { + "file" : "IPC/Run3/ProfPP.pm", + "version" : "0.044" + }, + "IPC::Run3::ProfReporter" : { + "file" : "IPC/Run3/ProfReporter.pm", + "version" : "0.044" + } + }, + "version" : "0.044" + }, + "Image::Size" : { + "dist" : "Image-Size-3.230", + "module" : "Image::Size", + "mymeta" : { + "abstract" : "A library to extract height/width from images", + "author" : [ + "Randy J. Ray <rjray@blackperl.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.3607, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Image-Size", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "recommends" : { + "Compress::Zlib" : "2" + }, + "requires" : { + "File::Spec" : "0.8", + "Module::Build" : "0.28", + "Test::More" : "0.80" + } + } + }, + "provides" : { + "Image::Size" : { + "file" : "lib/Image/Size.pm", + "version" : "3.230" + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=Image-Size" + }, + "homepage" : "http://search.cpan.org/dist/Image-Size", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/rjray/image-size" + } + }, + "version" : "3.230" + }, + "name" : "Image::Size", + "pathname" : "R/RJ/RJRAY/Image-Size-3.230.tar.gz", + "provides" : { + "Image::Size" : { + "file" : "Image/Size.pm", + "version" : "3.230" + } + }, + "version" : "3.230" + }, + "LWP" : { + "dist" : "libwww-perl-6.03", + "module" : "LWP", + "mymeta" : { + "abstract" : "The World-Wide Web library for Perl", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "libwww-perl", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "Authen::NTLM" : "1.02", + "Data::Dump" : 0, + "LWP::Protocol::https" : "6.02" + }, + "requires" : { + "Digest::MD5" : 0, + "Encode" : "2.12", + "Encode::Locale" : 0, + "File::Listing" : "6", + "HTML::Entities" : 0, + "HTML::HeadParser" : 0, + "HTTP::Cookies" : "6", + "HTTP::Daemon" : "6", + "HTTP::Date" : "6", + "HTTP::Negotiate" : "6", + "HTTP::Request" : "6", + "HTTP::Request::Common" : "6", + "HTTP::Response" : "6", + "HTTP::Status" : "6", + "IO::Select" : 0, + "IO::Socket" : 0, + "LWP::MediaTypes" : "6", + "MIME::Base64" : "2.1", + "Net::FTP" : "2.58", + "Net::HTTP" : "6", + "URI" : "1.10", + "URI::Escape" : 0, + "WWW::RobotRules" : "6", + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.03" + }, + "name" : "LWP", + "pathname" : "G/GA/GAAS/libwww-perl-6.03.tar.gz", + "provides" : { + "LWP" : { + "file" : "LWP.pm", + "version" : "6.03" + }, + "LWP::Authen::Basic" : { + "file" : "LWP/Authen/Basic.pm" + }, + "LWP::Authen::Digest" : { + "file" : "LWP/Authen/Digest.pm" + }, + "LWP::Authen::Ntlm" : { + "file" : "LWP/Authen/Ntlm.pm", + "version" : "6.00" + }, + "LWP::ConnCache" : { + "file" : "LWP/ConnCache.pm", + "version" : "6.02" + }, + "LWP::Debug" : { + "file" : "LWP/Debug.pm" + }, + "LWP::DebugFile" : { + "file" : "LWP/DebugFile.pm" + }, + "LWP::MemberMixin" : { + "file" : "LWP/MemberMixin.pm" + }, + "LWP::Protocol" : { + "file" : "LWP/Protocol.pm", + "version" : "6.00" + }, + "LWP::Protocol::GHTTP" : { + "file" : "LWP/Protocol/GHTTP.pm" + }, + "LWP::Protocol::MyFTP" : { + "file" : "LWP/Protocol/ftp.pm" + }, + "LWP::Protocol::cpan" : { + "file" : "LWP/Protocol/cpan.pm" + }, + "LWP::Protocol::data" : { + "file" : "LWP/Protocol/data.pm" + }, + "LWP::Protocol::file" : { + "file" : "LWP/Protocol/file.pm" + }, + "LWP::Protocol::ftp" : { + "file" : "LWP/Protocol/ftp.pm" + }, + "LWP::Protocol::gopher" : { + "file" : "LWP/Protocol/gopher.pm" + }, + "LWP::Protocol::http" : { + "file" : "LWP/Protocol/http.pm" + }, + "LWP::Protocol::http::Socket" : { + "file" : "LWP/Protocol/http.pm" + }, + "LWP::Protocol::http::SocketMethods" : { + "file" : "LWP/Protocol/http.pm" + }, + "LWP::Protocol::loopback" : { + "file" : "LWP/Protocol/loopback.pm" + }, + "LWP::Protocol::mailto" : { + "file" : "LWP/Protocol/mailto.pm" + }, + "LWP::Protocol::nntp" : { + "file" : "LWP/Protocol/nntp.pm" + }, + "LWP::Protocol::nogo" : { + "file" : "LWP/Protocol/nogo.pm" + }, + "LWP::RobotUA" : { + "file" : "LWP/RobotUA.pm", + "version" : "6.03" + }, + "LWP::Simple" : { + "file" : "LWP/Simple.pm", + "version" : "6.00" + }, + "LWP::UserAgent" : { + "file" : "LWP/UserAgent.pm", + "version" : "6.03" + } + }, + "version" : "6.03" + }, + "LWP::MediaTypes" : { + "dist" : "LWP-MediaTypes-6.01", + "module" : "LWP::MediaTypes", + "mymeta" : { + "abstract" : "guess media type for a file or a URL", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "LWP-MediaTypes", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.01" + }, + "name" : "LWP::MediaTypes", + "pathname" : "G/GA/GAAS/LWP-MediaTypes-6.01.tar.gz", + "provides" : { + "LWP::MediaTypes" : { + "file" : "LWP/MediaTypes.pm", + "version" : "6.01" + } + }, + "version" : "6.01" + }, + "List::MoreUtils" : { + "dist" : "List-MoreUtils-0.33", + "module" : "List::MoreUtils", + "mymeta" : { + "abstract" : "Provide the stuff missing in List::Util", + "author" : [ + "Tassilo von Parseval <tassilo.von.parseval@rwth-aachen.de>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "List-MoreUtils", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::CBuilder" : "0.27", + "ExtUtils::MakeMaker" : "6.52" + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.82", + "perl" : "5.00503" + } + } + }, + "release_status" : "stable", + "version" : "0.33" + }, + "name" : "List::MoreUtils", + "pathname" : "A/AD/ADAMK/List-MoreUtils-0.33.tar.gz", + "provides" : { + "List::MoreUtils" : { + "file" : "List/MoreUtils.pm", + "version" : "0.33" + } + }, + "version" : "0.33" + }, + "Log::Log4perl" : { + "dist" : "Log-Log4perl-1.34", + "module" : "Log::Log4perl", + "mymeta" : { + "abstract" : "Log4j implementation for Perl", + "author" : [ + "Mike Schilli <m@perlmeister.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Log-Log4perl", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "File::Spec" : "0.82", + "Test::More" : "0.45" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/mschilli/log4perl" + }, + "x_MailingList" : "mailto:log4perl-devel@lists.sourceforge.net" + }, + "version" : "1.34" + }, + "name" : "Log::Log4perl", + "pathname" : "M/MS/MSCHILLI/Log-Log4perl-1.34.tar.gz", + "provides" : { + "Log::Log4perl" : { + "file" : "Log/Log4perl.pm", + "version" : "1.34" + }, + "Log::Log4perl::Appender" : { + "file" : "Log/Log4perl/Appender.pm" + }, + "Log::Log4perl::Appender::Buffer" : { + "file" : "Log/Log4perl/Appender/Buffer.pm", + "version" : "0" + }, + "Log::Log4perl::Appender::DBI" : { + "file" : "Log/Log4perl/Appender/DBI.pm" + }, + "Log::Log4perl::Appender::File" : { + "file" : "Log/Log4perl/Appender/File.pm" + }, + "Log::Log4perl::Appender::Limit" : { + "file" : "Log/Log4perl/Appender/Limit.pm", + "version" : "0" + }, + "Log::Log4perl::Appender::RRDs" : { + "file" : "Log/Log4perl/Appender/RRDs.pm" + }, + "Log::Log4perl::Appender::Screen" : { + "file" : "Log/Log4perl/Appender/Screen.pm" + }, + "Log::Log4perl::Appender::ScreenColoredLevels" : { + "file" : "Log/Log4perl/Appender/ScreenColoredLevels.pm" + }, + "Log::Log4perl::Appender::Socket" : { + "file" : "Log/Log4perl/Appender/Socket.pm" + }, + "Log::Log4perl::Appender::String" : { + "file" : "Log/Log4perl/Appender/String.pm" + }, + "Log::Log4perl::Appender::Synchronized" : { + "file" : "Log/Log4perl/Appender/Synchronized.pm", + "version" : "0" + }, + "Log::Log4perl::Appender::TestArrayBuffer" : { + "file" : "Log/Log4perl/Appender/TestArrayBuffer.pm" + }, + "Log::Log4perl::Appender::TestBuffer" : { + "file" : "Log/Log4perl/Appender/TestBuffer.pm" + }, + "Log::Log4perl::Appender::TestFileCreeper" : { + "file" : "Log/Log4perl/Appender/TestFileCreeper.pm" + }, + "Log::Log4perl::Catalyst" : { + "file" : "Log/Log4perl/Catalyst.pm", + "version" : "0" + }, + "Log::Log4perl::Config" : { + "file" : "Log/Log4perl/Config.pm" + }, + "Log::Log4perl::Config::BaseConfigurator" : { + "file" : "Log/Log4perl/Config/BaseConfigurator.pm" + }, + "Log::Log4perl::Config::DOMConfigurator" : { + "file" : "Log/Log4perl/Config/DOMConfigurator.pm", + "version" : "0.03" + }, + "Log::Log4perl::Config::PropertyConfigurator" : { + "file" : "Log/Log4perl/Config/PropertyConfigurator.pm" + }, + "Log::Log4perl::Config::Watch" : { + "file" : "Log/Log4perl/Config/Watch.pm" + }, + "Log::Log4perl::DateFormat" : { + "file" : "Log/Log4perl/DateFormat.pm" + }, + "Log::Log4perl::Filter" : { + "file" : "Log/Log4perl/Filter.pm" + }, + "Log::Log4perl::Filter::Boolean" : { + "file" : "Log/Log4perl/Filter/Boolean.pm" + }, + "Log::Log4perl::Filter::LevelMatch" : { + "file" : "Log/Log4perl/Filter/LevelMatch.pm" + }, + "Log::Log4perl::Filter::LevelRange" : { + "file" : "Log/Log4perl/Filter/LevelRange.pm" + }, + "Log::Log4perl::Filter::StringMatch" : { + "file" : "Log/Log4perl/Filter/StringMatch.pm" + }, + "Log::Log4perl::InternalDebug" : { + "file" : "Log/Log4perl/InternalDebug.pm" + }, + "Log::Log4perl::JavaMap" : { + "file" : "Log/Log4perl/JavaMap.pm" + }, + "Log::Log4perl::JavaMap::ConsoleAppender" : { + "file" : "Log/Log4perl/JavaMap/ConsoleAppender.pm" + }, + "Log::Log4perl::JavaMap::FileAppender" : { + "file" : "Log/Log4perl/JavaMap/FileAppender.pm" + }, + "Log::Log4perl::JavaMap::JDBCAppender" : { + "file" : "Log/Log4perl/JavaMap/JDBCAppender.pm" + }, + "Log::Log4perl::JavaMap::NTEventLogAppender" : { + "file" : "Log/Log4perl/JavaMap/NTEventLogAppender.pm" + }, + "Log::Log4perl::JavaMap::RollingFileAppender" : { + "file" : "Log/Log4perl/JavaMap/RollingFileAppender.pm" + }, + "Log::Log4perl::JavaMap::SyslogAppender" : { + "file" : "Log/Log4perl/JavaMap/SyslogAppender.pm" + }, + "Log::Log4perl::JavaMap::TestBuffer" : { + "file" : "Log/Log4perl/JavaMap/TestBuffer.pm" + }, + "Log::Log4perl::Layout" : { + "file" : "Log/Log4perl/Layout.pm" + }, + "Log::Log4perl::Layout::NoopLayout" : { + "file" : "Log/Log4perl/Layout/NoopLayout.pm" + }, + "Log::Log4perl::Layout::PatternLayout" : { + "file" : "Log/Log4perl/Layout/PatternLayout.pm" + }, + "Log::Log4perl::Layout::PatternLayout::Multiline" : { + "file" : "Log/Log4perl/Layout/PatternLayout/Multiline.pm" + }, + "Log::Log4perl::Layout::SimpleLayout" : { + "file" : "Log/Log4perl/Layout/SimpleLayout.pm" + }, + "Log::Log4perl::Level" : { + "file" : "Log/Log4perl/Level.pm" + }, + "Log::Log4perl::Logger" : { + "file" : "Log/Log4perl/Logger.pm" + }, + "Log::Log4perl::MDC" : { + "file" : "Log/Log4perl/MDC.pm" + }, + "Log::Log4perl::NDC" : { + "file" : "Log/Log4perl/NDC.pm" + }, + "Log::Log4perl::Resurrector" : { + "file" : "Log/Log4perl/Resurrector.pm" + }, + "Log::Log4perl::Util" : { + "file" : "Log/Log4perl/Util.pm" + }, + "Log::Log4perl::Util::Semaphore" : { + "file" : "Log/Log4perl/Util/Semaphore.pm" + }, + "Log::Log4perl::Util::TimeTracker" : { + "file" : "Log/Log4perl/Util/TimeTracker.pm" + } + }, + "version" : "1.34" + }, + "MIME::Types" : { + "dist" : "MIME-Types-1.32", + "module" : "MIME::Types", + "mymeta" : { + "abstract" : "Definition of MIME types", + "author" : [ + "Mark Overmeer" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MIME-Types", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "1.32" + }, + "name" : "MIME::Types", + "pathname" : "M/MA/MARKOV/MIME-Types-1.32.tar.gz", + "provides" : { + "MIME::Type" : { + "file" : "MIME/Type.pm", + "version" : "1.32" + }, + "MIME::Types" : { + "file" : "MIME/Types.pm", + "version" : "1.32" + } + }, + "version" : "1.32" + }, + "MRO::Compat" : { + "dist" : "MRO-Compat-0.11", + "module" : "MRO::Compat", + "mymeta" : { + "abstract" : "mro::* interface compatibility for Perls < 5.9.5", + "author" : [ + "Brandon L. Black, <blblack@gmail.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MRO-Compat", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : "0.47" + } + } + }, + "provides" : { + "MRO::Compat" : { + "file" : "lib/MRO/Compat.pm", + "version" : "0.11" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.11" + }, + "name" : "MRO::Compat", + "pathname" : "F/FL/FLORA/MRO-Compat-0.11.tar.gz", + "provides" : { + "MRO::Compat" : { + "file" : "MRO/Compat.pm", + "version" : "0.11" + } + }, + "version" : "0.11" + }, + "Mail" : { + "dist" : "MailTools-2.08", + "module" : "Mail::Address", + "mymeta" : { + "abstract" : "Various e-mail related modules", + "author" : [ + "Mark Overmeer <perl@overmeer.net>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MailTools", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Date::Format" : 0, + "Date::Parse" : 0, + "IO::Handle" : 0, + "Net::Domain" : "1.05", + "Net::SMTP" : "1.03", + "Test::More" : 0, + "Test::Pod" : "1" + } + } + }, + "release_status" : "stable", + "version" : "2.08" + }, + "name" : "Mail", + "pathname" : "M/MA/MARKOV/MailTools-2.08.tar.gz", + "provides" : { + "Mail::Address" : { + "file" : "Mail/Address.pm", + "version" : "2.08" + }, + "Mail::Cap" : { + "file" : "Mail/Cap.pm", + "version" : "2.08" + }, + "Mail::Field" : { + "file" : "Mail/Field.pm", + "version" : "2.08" + }, + "Mail::Field::AddrList" : { + "file" : "Mail/Field/AddrList.pm", + "version" : "2.08" + }, + "Mail::Field::Date" : { + "file" : "Mail/Field/Date.pm", + "version" : "2.08" + }, + "Mail::Field::Generic" : { + "file" : "Mail/Field/Generic.pm", + "version" : "2.08" + }, + "Mail::Filter" : { + "file" : "Mail/Filter.pm", + "version" : "2.08" + }, + "Mail::Header" : { + "file" : "Mail/Header.pm", + "version" : "2.08" + }, + "Mail::Internet" : { + "file" : "Mail/Internet.pm", + "version" : "2.08" + }, + "Mail::Mailer" : { + "file" : "Mail/Mailer.pm", + "version" : "2.08" + }, + "Mail::Mailer::qmail" : { + "file" : "Mail/Mailer/qmail.pm", + "version" : "2.08" + }, + "Mail::Mailer::rfc822" : { + "file" : "Mail/Mailer/rfc822.pm", + "version" : "2.08" + }, + "Mail::Mailer::sendmail" : { + "file" : "Mail/Mailer/sendmail.pm", + "version" : "2.08" + }, + "Mail::Mailer::smtp" : { + "file" : "Mail/Mailer/smtp.pm", + "version" : "2.08" + }, + "Mail::Mailer::smtp::pipe" : { + "file" : "Mail/Mailer/smtp.pm", + "version" : "2.08" + }, + "Mail::Mailer::smtps" : { + "file" : "Mail/Mailer/smtps.pm", + "version" : "2.08" + }, + "Mail::Mailer::smtps::pipe" : { + "file" : "Mail/Mailer/smtps.pm", + "version" : "2.08" + }, + "Mail::Mailer::testfile" : { + "file" : "Mail/Mailer/testfile.pm", + "version" : "2.08" + }, + "Mail::Mailer::testfile::pipe" : { + "file" : "Mail/Mailer/testfile.pm", + "version" : "2.08" + }, + "Mail::Send" : { + "file" : "Mail/Send.pm", + "version" : "2.08" + }, + "Mail::Util" : { + "file" : "Mail/Util.pm", + "version" : "2.08" + } + }, + "version" : "2.08" + }, + "Math::BigInt" : { + "dist" : "Math-BigInt-1.997", + "module" : "Math::BigInt", + "mymeta" : { + "abstract" : "Arbitrary size integer/float math package", + "author" : [ + "Original code by Mark Biggar, overloaded interface by Ilya Zakharevich., Tels <nospam-abuse@bloodgate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Math-BigInt", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : "0.62" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "perl" : "5.006002" + } + } + }, + "release_status" : "stable", + "version" : "1.997" + }, + "name" : "Math::BigInt", + "pathname" : "P/PJ/PJACKLAM/Math-BigInt-1.997.tar.gz", + "provides" : { + "Math::BigFloat" : { + "file" : "Math/BigFloat.pm", + "version" : "1.997" + }, + "Math::BigInt" : { + "file" : "Math/BigInt.pm", + "version" : "1.997" + }, + "Math::BigInt::Calc" : { + "file" : "Math/BigInt/Calc.pm", + "version" : "1.997" + }, + "Math::BigInt::CalcEmu" : { + "file" : "Math/BigInt/CalcEmu.pm", + "version" : "1.997" + } + }, + "version" : "1.997" + }, + "Math::BigInt::GMP" : { + "dist" : "Math-BigInt-GMP-1.37", + "module" : "Math::BigInt::GMP", + "mymeta" : { + "abstract" : "Use the GMP library for Math::BigInt routines", + "author" : [ + "Tels" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Math-BigInt-GMP", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Math::BigInt" : "1.997", + "XSLoader" : "0.02" + } + } + }, + "release_status" : "stable", + "version" : "1.37" + }, + "name" : "Math::BigInt::GMP", + "pathname" : "P/PJ/PJACKLAM/Math-BigInt-GMP-1.37.tar.gz", + "provides" : { + "Math::BigInt::GMP" : { + "file" : "Math/BigInt/GMP.pm", + "version" : "1.37" + } + }, + "version" : "1.37" + }, + "Math::Round" : { + "dist" : "Math-Round-0.06", + "module" : "Math::Round", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Math-Round", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "0.06" + }, + "name" : "Math::Round", + "pathname" : "G/GR/GROMMEL/Math-Round-0.06.tar.gz", + "provides" : { + "Math::Round" : { + "file" : "Math/Round.pm", + "version" : "0.06" + } + }, + "version" : "0.06" + }, + "Module::Extract::Namespaces" : { + "dist" : "Module-Extract-Namespaces-0.14", + "module" : "Module::Extract::Namespaces", + "mymeta" : { + "abstract" : "This is what the module does", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.44, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Module-Extract-Namespaces", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "PPI" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.14" + }, + "name" : "Module::Extract::Namespaces", + "pathname" : "/authors/id/B/BD/BDFOY/Module-Extract-Namespaces-0.14.tar.gz", + "provides" : { + "Module::Extract::Namespaces" : { + "file" : "Module/Extract/Namespaces.pm", + "version" : "0.14" + } + }, + "version" : "0.14" + }, + "Module::Extract::Use" : { + "dist" : "Module-Extract-Use-0.17", + "module" : "Module::Extract::Use", + "mymeta" : { + "abstract" : "Extract the modules that a modules uses", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "keywords" : [ + "ppi", + "parsing", + "static-analysis", + "modules" + ], + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Module-Extract-Use", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "PPI" : 0, + "Test::More" : 0, + "Test::Output" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/briandfoy/module--extract--use.git" + } + }, + "version" : "0.17" + }, + "name" : "Module::Extract::Use", + "pathname" : "/authors/id/B/BD/BDFOY/Module-Extract-Use-0.17.tar.gz", + "provides" : { + "Module::Extract::Use" : { + "file" : "Module/Extract/Use.pm", + "version" : "0.17" + } + }, + "version" : "0.17" + }, + "Module::Extract::VERSION" : { + "dist" : "Module-Extract-VERSION-0.13", + "module" : "Module::Extract::VERSION", + "mymeta" : { + "abstract" : "Extract ERSION from module source code", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Module-Extract-VERSION", + "no_index" : { + "directory" : [ + "t", + "inc", + "t", + "inc", + "corpus" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.13" + }, + "name" : "Module::Extract::VERSION", + "pathname" : "/authors/id/B/BD/BDFOY/Module-Extract-VERSION-0.13.tar.gz", + "provides" : { + "Module::Extract::VERSION" : { + "file" : "Module/Extract/VERSION.pm", + "version" : "0.13" + } + }, + "version" : "0.13" + }, + "Module::Find" : { + "dist" : "Module-Find-0.10", + "module" : "Module::Find", + "mymeta" : { + "abstract" : "Find and use installed modules in a (sub)category", + "author" : [ + "Christian Renz <crenz@web42.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.52, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Module-Find", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "Test::Pod" : "1.14", + "Test::Pod::Coverage" : "1.04" + }, + "requires" : { + "File::Find" : 0, + "File::Spec" : 0, + "perl" : "5.006001" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/crenz/Module-Find" + } + }, + "version" : "0.10" + }, + "name" : "Module::Find", + "pathname" : "/authors/id/C/CR/CRENZ/Module-Find-0.10.tar.gz", + "provides" : { + "Module::Find" : { + "file" : "Module/Find.pm", + "version" : "0.10" + } + }, + "version" : "0.10" + }, + "Module::Runtime" : { + "dist" : "Module-Runtime-0.011", + "module" : "Module::Runtime", + "mymeta" : { + "abstract" : "runtime module handling", + "author" : [ + "Andrew Main (Zefram) <zefram@fysh.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Module-Runtime", + "prereqs" : { + "build" : { + "requires" : { + "Module::Build" : 0, + "Test::More" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + }, + "runtime" : { + "requires" : { + "Exporter" : 0, + "Params::Classify" : 0, + "parent" : 0, + "perl" : "5.006", + "strict" : 0, + "warnings" : 0 + } + } + }, + "provides" : { + "Module::Runtime" : { + "file" : "lib/Module/Runtime.pm", + "version" : "0.011" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.011" + }, + "name" : "Module::Runtime", + "pathname" : "Z/ZE/ZEFRAM/Module-Runtime-0.011.tar.gz", + "provides" : { + "Module::Runtime" : { + "file" : "Module/Runtime.pm", + "version" : "0.011" + } + }, + "version" : "0.011" + }, + "Moose" : { + "dist" : "Moose-2.0401", + "module" : "Moose::Role", + "mymeta" : { + "abstract" : "A postmodern object system for Perl 5", + "author" : [ + "Moose is maintained by the Moose Cabal, along with the help of many contributors. See L<Moose/CABAL> and L<Moose/CONTRIBUTORS> for details." + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300002, CPAN::Meta::Converter version 2.110440, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Moose", + "no_index" : { + "directory" : [ + "benchmarks" + ], + "namespace" : [ + "Class::MOP::Mixin", + "Moose::Meta::Method::Accessor::Native", + "Moose::Meta::Mixin" + ], + "package" : [ + "Class::MOP::Class::Immutable::Trait", + "Class::MOP::Deprecated", + "Class::MOP::MiniTrait", + "Class::MOP::Mixin", + "Moose::Deprecated", + "Moose::Error::Util", + "Moose::Meta::Attribute::Native::Trait", + "Moose::Meta::Class::Immutable::Trait", + "Moose::Meta::Method::Accessor::Native", + "Moose::Meta::Object::Trait", + "Moose::Util::TypeConstraints::OptimizedConstraints", + "Moose::Util::TypeConstraints::Builtins" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : "0.001", + "Test::More" : "0.88", + "Test::Requires" : "0.05" + } + }, + "configure" : { + "requires" : { + "Dist::CheckConflicts" : "0.02", + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "recommends" : { + "Devel::PartialDump" : "0.14" + }, + "requires" : { + "Class::Load" : "0.09", + "Class::Load::XS" : "0.01", + "Data::OptList" : "0.107", + "Devel::GlobalDestruction" : 0, + "Dist::CheckConflicts" : "0.02", + "Eval::Closure" : "0.04", + "List::MoreUtils" : "0.28", + "MRO::Compat" : "0.05", + "Package::DeprecationManager" : "0.11", + "Package::Stash" : "0.32", + "Package::Stash::XS" : "0.24", + "Params::Util" : "1.00", + "Scalar::Util" : "1.19", + "Sub::Exporter" : "0.980", + "Sub::Name" : "0.05", + "Task::Weaken" : 0, + "Try::Tiny" : "0.02" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Moose" + }, + "repository" : { + "type" : "git", + "url" : "git://git.moose.perl.org/Moose.git" + } + }, + "version" : "2.0401", + "x_authority" : "cpan:STEVAN", + "x_conflicts" : { + "Catalyst" : "5.80028", + "Devel::REPL" : "1.003008", + "Fey" : "0.36", + "Fey::ORM" : "0.42", + "File::ChangeNotify" : "0.15", + "KiokuDB" : "0.51", + "Markdent" : "0.16", + "MooseX::Aliases" : "0.08", + "MooseX::AlwaysCoerce" : "0.13", + "MooseX::Attribute::Deflator" : "2.1.7", + "MooseX::Attribute::Dependent" : "1.1.0", + "MooseX::Attribute::Prototype" : "0.10", + "MooseX::AttributeHelpers" : "0.22", + "MooseX::AttributeIndexes" : "1.0.0", + "MooseX::AttributeInflate" : "0.02", + "MooseX::CascadeClearing" : "0.03", + "MooseX::ClassAttribute" : "0.25", + "MooseX::Constructor::AllErrors" : "0.012", + "MooseX::FollowPBP" : "0.02", + "MooseX::HasDefaults" : "0.02", + "MooseX::InstanceTracking" : "0.04", + "MooseX::LazyRequire" : "0.06", + "MooseX::Meta::Attribute::Index" : "0.04", + "MooseX::Meta::Attribute::Lvalue" : "0.05", + "MooseX::MethodAttributes" : "0.22", + "MooseX::NonMoose" : "0.17", + "MooseX::POE" : "0.211", + "MooseX::Params::Validate" : "0.05", + "MooseX::PrivateSetters" : "0.03", + "MooseX::Role::Cmd" : "0.06", + "MooseX::Role::Parameterized" : "0.23", + "MooseX::Role::WithOverloading" : "0.07", + "MooseX::SemiAffordanceAccessor" : "0.05", + "MooseX::SetOnce" : "0.100473", + "MooseX::Singleton" : "0.25", + "MooseX::SlurpyConstructor" : "1.1", + "MooseX::StrictConstructor" : "0.12", + "MooseX::Types" : "0.19", + "MooseX::Types::Parameterizable" : "0.05", + "MooseX::Types::Signal" : "1.101930", + "MooseX::UndefTolerant" : "0.11", + "PRANG" : "0.14", + "Pod::Elemental" : "0.093280", + "Reaction" : "0.002003", + "Test::Able" : "0.10", + "namespace::autoclean" : "0.08" + } + }, + "name" : "Moose", + "pathname" : "D/DO/DOY/Moose-2.0401.tar.gz", + "provides" : { + "Class::MOP" : { + "file" : "Class/MOP.pm", + "version" : "2.0401" + }, + "Class::MOP::Attribute" : { + "file" : "Class/MOP/Attribute.pm", + "version" : "2.0401" + }, + "Class::MOP::Class" : { + "file" : "Class/MOP/Class.pm", + "version" : "2.0401" + }, + "Class::MOP::Class::Immutable::Trait" : { + "file" : "Class/MOP/Class/Immutable/Trait.pm", + "version" : "2.0401" + }, + "Class::MOP::Deprecated" : { + "file" : "Class/MOP/Deprecated.pm", + "version" : "2.0401" + }, + "Class::MOP::Instance" : { + "file" : "Class/MOP/Instance.pm", + "version" : "2.0401" + }, + "Class::MOP::Method" : { + "file" : "Class/MOP/Method.pm", + "version" : "2.0401" + }, + "Class::MOP::Method::Accessor" : { + "file" : "Class/MOP/Method/Accessor.pm", + "version" : "2.0401" + }, + "Class::MOP::Method::Constructor" : { + "file" : "Class/MOP/Method/Constructor.pm", + "version" : "2.0401" + }, + "Class::MOP::Method::Generated" : { + "file" : "Class/MOP/Method/Generated.pm", + "version" : "2.0401" + }, + "Class::MOP::Method::Inlined" : { + "file" : "Class/MOP/Method/Inlined.pm", + "version" : "2.0401" + }, + "Class::MOP::Method::Meta" : { + "file" : "Class/MOP/Method/Meta.pm", + "version" : "2.0401" + }, + "Class::MOP::Method::Wrapped" : { + "file" : "Class/MOP/Method/Wrapped.pm", + "version" : "2.0401" + }, + "Class::MOP::MiniTrait" : { + "file" : "Class/MOP/MiniTrait.pm", + "version" : "2.0401" + }, + "Class::MOP::Mixin" : { + "file" : "Class/MOP/Mixin.pm", + "version" : "2.0401" + }, + "Class::MOP::Mixin::AttributeCore" : { + "file" : "Class/MOP/Mixin/AttributeCore.pm", + "version" : "2.0401" + }, + "Class::MOP::Mixin::HasAttributes" : { + "file" : "Class/MOP/Mixin/HasAttributes.pm", + "version" : "2.0401" + }, + "Class::MOP::Mixin::HasMethods" : { + "file" : "Class/MOP/Mixin/HasMethods.pm", + "version" : "2.0401" + }, + "Class::MOP::Module" : { + "file" : "Class/MOP/Module.pm", + "version" : "2.0401" + }, + "Class::MOP::Object" : { + "file" : "Class/MOP/Object.pm", + "version" : "2.0401" + }, + "Class::MOP::Package" : { + "file" : "Class/MOP/Package.pm", + "version" : "2.0401" + }, + "Moose" : { + "file" : "Moose.pm", + "version" : "2.0401" + }, + "Moose::Deprecated" : { + "file" : "Moose/Deprecated.pm", + "version" : "2.0401" + }, + "Moose::Error::Confess" : { + "file" : "Moose/Error/Confess.pm", + "version" : "2.0401" + }, + "Moose::Error::Croak" : { + "file" : "Moose/Error/Croak.pm", + "version" : "2.0401" + }, + "Moose::Error::Default" : { + "file" : "Moose/Error/Default.pm", + "version" : "2.0401" + }, + "Moose::Exporter" : { + "file" : "Moose/Exporter.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute" : { + "file" : "Moose/Meta/Attribute.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Custom::Moose" : { + "file" : "Moose/Meta/Attribute.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native" : { + "file" : "Moose/Meta/Attribute/Native.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait" : { + "file" : "Moose/Meta/Attribute/Native/Trait.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::Array" : { + "file" : "Moose/Meta/Attribute/Native/Trait/Array.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::Bool" : { + "file" : "Moose/Meta/Attribute/Native/Trait/Bool.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::Code" : { + "file" : "Moose/Meta/Attribute/Native/Trait/Code.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::Counter" : { + "file" : "Moose/Meta/Attribute/Native/Trait/Counter.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::Hash" : { + "file" : "Moose/Meta/Attribute/Native/Trait/Hash.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::Number" : { + "file" : "Moose/Meta/Attribute/Native/Trait/Number.pm", + "version" : "2.0401" + }, + "Moose::Meta::Attribute::Native::Trait::String" : { + "file" : "Moose/Meta/Attribute/Native/Trait/String.pm", + "version" : "2.0401" + }, + "Moose::Meta::Class" : { + "file" : "Moose/Meta/Class.pm", + "version" : "2.0401" + }, + "Moose::Meta::Class::Immutable::Trait" : { + "file" : "Moose/Meta/Class/Immutable/Trait.pm", + "version" : "2.0401" + }, + "Moose::Meta::Instance" : { + "file" : "Moose/Meta/Instance.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method" : { + "file" : "Moose/Meta/Method.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor" : { + "file" : "Moose/Meta/Method/Accessor.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native" : { + "file" : "Moose/Meta/Method/Accessor/Native.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::Writer" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/Writer.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::accessor" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/accessor.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::clear" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/clear.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::count" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/count.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::delete" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/delete.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::elements" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/elements.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::first" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/first.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::first_index" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/first_index.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::get" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/get.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::grep" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/grep.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::insert" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/insert.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::is_empty" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/is_empty.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::join" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/join.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::map" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/map.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::natatime" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/natatime.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::pop" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/pop.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::push" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/push.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::reduce" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/reduce.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::set" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/set.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::shallow_clone" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/shallow_clone.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::shift" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/shift.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::shuffle" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/shuffle.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::sort" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/sort.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::sort_in_place" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/sort_in_place.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::splice" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/splice.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::uniq" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/uniq.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Array::unshift" : { + "file" : "Moose/Meta/Method/Accessor/Native/Array/unshift.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Bool::not" : { + "file" : "Moose/Meta/Method/Accessor/Native/Bool/not.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Bool::set" : { + "file" : "Moose/Meta/Method/Accessor/Native/Bool/set.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Bool::toggle" : { + "file" : "Moose/Meta/Method/Accessor/Native/Bool/toggle.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Bool::unset" : { + "file" : "Moose/Meta/Method/Accessor/Native/Bool/unset.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Code::execute" : { + "file" : "Moose/Meta/Method/Accessor/Native/Code/execute.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Code::execute_method" : { + "file" : "Moose/Meta/Method/Accessor/Native/Code/execute_method.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Collection" : { + "file" : "Moose/Meta/Method/Accessor/Native/Collection.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Counter::Writer" : { + "file" : "Moose/Meta/Method/Accessor/Native/Counter/Writer.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Counter::dec" : { + "file" : "Moose/Meta/Method/Accessor/Native/Counter/dec.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Counter::inc" : { + "file" : "Moose/Meta/Method/Accessor/Native/Counter/inc.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Counter::reset" : { + "file" : "Moose/Meta/Method/Accessor/Native/Counter/reset.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Counter::set" : { + "file" : "Moose/Meta/Method/Accessor/Native/Counter/set.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::Writer" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/Writer.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::accessor" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/accessor.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::clear" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/clear.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::count" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/count.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::defined" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/defined.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::delete" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/delete.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::elements" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/elements.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::exists" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/exists.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::get" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/get.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::is_empty" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/is_empty.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::keys" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/keys.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::kv" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/kv.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::set" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/set.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::shallow_clone" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/shallow_clone.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Hash::values" : { + "file" : "Moose/Meta/Method/Accessor/Native/Hash/values.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::abs" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/abs.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::add" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/add.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::div" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/div.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::mod" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/mod.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::mul" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/mul.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::set" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/set.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Number::sub" : { + "file" : "Moose/Meta/Method/Accessor/Native/Number/sub.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Reader" : { + "file" : "Moose/Meta/Method/Accessor/Native/Reader.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::append" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/append.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::chomp" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/chomp.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::chop" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/chop.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::clear" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/clear.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::inc" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/inc.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::length" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/length.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::match" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/match.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::prepend" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/prepend.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::replace" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/replace.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::String::substr" : { + "file" : "Moose/Meta/Method/Accessor/Native/String/substr.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Accessor::Native::Writer" : { + "file" : "Moose/Meta/Method/Accessor/Native/Writer.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Augmented" : { + "file" : "Moose/Meta/Method/Augmented.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Constructor" : { + "file" : "Moose/Meta/Method/Constructor.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Delegation" : { + "file" : "Moose/Meta/Method/Delegation.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Destructor" : { + "file" : "Moose/Meta/Method/Destructor.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Meta" : { + "file" : "Moose/Meta/Method/Meta.pm", + "version" : "2.0401" + }, + "Moose::Meta::Method::Overridden" : { + "file" : "Moose/Meta/Method/Overridden.pm", + "version" : "2.0401" + }, + "Moose::Meta::Mixin::AttributeCore" : { + "file" : "Moose/Meta/Mixin/AttributeCore.pm", + "version" : "2.0401" + }, + "Moose::Meta::Object::Trait" : { + "file" : "Moose/Meta/Object/Trait.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role" : { + "file" : "Moose/Meta/Role.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Application" : { + "file" : "Moose/Meta/Role/Application.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Application::RoleSummation" : { + "file" : "Moose/Meta/Role/Application/RoleSummation.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Application::ToClass" : { + "file" : "Moose/Meta/Role/Application/ToClass.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Application::ToInstance" : { + "file" : "Moose/Meta/Role/Application/ToInstance.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Application::ToRole" : { + "file" : "Moose/Meta/Role/Application/ToRole.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Attribute" : { + "file" : "Moose/Meta/Role/Attribute.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Composite" : { + "file" : "Moose/Meta/Role/Composite.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Method" : { + "file" : "Moose/Meta/Role/Method.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Method::Conflicting" : { + "file" : "Moose/Meta/Role/Method/Conflicting.pm", + "version" : "2.0401" + }, + "Moose::Meta::Role::Method::Required" : { + "file" : "Moose/Meta/Role/Method/Required.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeCoercion" : { + "file" : "Moose/Meta/TypeCoercion.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeCoercion::Union" : { + "file" : "Moose/Meta/TypeCoercion/Union.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint" : { + "file" : "Moose/Meta/TypeConstraint.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Class" : { + "file" : "Moose/Meta/TypeConstraint/Class.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::DuckType" : { + "file" : "Moose/Meta/TypeConstraint/DuckType.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Enum" : { + "file" : "Moose/Meta/TypeConstraint/Enum.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Parameterizable" : { + "file" : "Moose/Meta/TypeConstraint/Parameterizable.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Parameterized" : { + "file" : "Moose/Meta/TypeConstraint/Parameterized.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Registry" : { + "file" : "Moose/Meta/TypeConstraint/Registry.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Role" : { + "file" : "Moose/Meta/TypeConstraint/Role.pm", + "version" : "2.0401" + }, + "Moose::Meta::TypeConstraint::Union" : { + "file" : "Moose/Meta/TypeConstraint/Union.pm", + "version" : "2.0401" + }, + "Moose::Object" : { + "file" : "Moose/Object.pm", + "version" : "2.0401" + }, + "Moose::Role" : { + "file" : "Moose/Role.pm", + "version" : "2.0401" + }, + "Moose::Util" : { + "file" : "Moose/Util.pm", + "version" : "2.0401" + }, + "Moose::Util::MetaRole" : { + "file" : "Moose/Util/MetaRole.pm", + "version" : "2.0401" + }, + "Moose::Util::TypeConstraints" : { + "file" : "Moose/Util/TypeConstraints.pm", + "version" : "2.0401" + }, + "Moose::Util::TypeConstraints::Builtins" : { + "file" : "Moose/Util/TypeConstraints/Builtins.pm", + "version" : "2.0401" + }, + "Test::Moose" : { + "file" : "Test/Moose.pm", + "version" : "2.0401" + }, + "metaclass" : { + "file" : "metaclass.pm", + "version" : "2.0401" + }, + "oose" : { + "file" : "oose.pm", + "version" : "2.0401" + } + }, + "version" : "2.0401" + }, + "MooseX::Emulate::Class::Accessor::Fast" : { + "dist" : "MooseX-Emulate-Class-Accessor-Fast-0.00903", + "module" : "MooseX::Emulate::Class::Accessor::Fast", + "mymeta" : { + "abstract" : "Emulate Class::Accessor::Fast behavior using Moose attributes", + "author" : [ + "Guillermo Roditi (groditi) <groditi@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.91, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Emulate-Class-Accessor-Fast", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Moose" : "0.84", + "Test::Exception" : 0, + "Test::More" : 0, + "namespace::clean" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.00903" + }, + "name" : "MooseX::Emulate::Class::Accessor::Fast", + "pathname" : "F/FL/FLORA/MooseX-Emulate-Class-Accessor-Fast-0.00903.tar.gz", + "provides" : { + "MooseX::Adopt::Class::Accessor::Fast" : { + "file" : "MooseX/Adopt/Class/Accessor/Fast.pm", + "version" : "0.00200" + }, + "MooseX::Emulate::Class::Accessor::Fast" : { + "file" : "MooseX/Emulate/Class/Accessor/Fast.pm", + "version" : "0.00903" + }, + "MooseX::Emulate::Class::Accessor::Fast::Meta::Accessor" : { + "file" : "MooseX/Emulate/Class/Accessor/Fast/Meta/Accessor.pm" + }, + "MooseX::Emulate::Class::Accessor::Fast::Meta::Role::Attribute" : { + "file" : "MooseX/Emulate/Class/Accessor/Fast/Meta/Role/Attribute.pm" + } + }, + "version" : "0.00903" + }, + "MooseX::Getopt" : { + "dist" : "MooseX-Getopt-0.35", + "module" : "MooseX::Getopt", + "mymeta" : { + "abstract" : "A Moose role for processing command line options", + "author" : [ + "Stevan Little <stevan@iinteractive.com>", + "Brandon L. Black <blblack@gmail.com>", + "Yuval Kogman <nothingmuch@woobling.org>", + "Ryan D Johnson <ryan@innerfence.com>", + "Drew Taylor <drew@drewtaylor.com>", + "Tomas Doran <bobtfish@bobtfish.net>", + "Florian Ragwitz <rafl@debian.org>", + "Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>", + "Ævar Arnfjörð Bjarmason <avar@cpan.org>", + "Chris Prather <perigrin@cpan.org>", + "Karen Etheridge <ether@cpan.org>", + "Jonathan Swartz <swartz@pobox.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200001, CPAN::Meta::Converter version 2.101610, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Getopt", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : "0.003", + "Test::More" : "0.88", + "Test::Requires" : "0.05", + "Test::Warn" : "0.21" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "Getopt::Long" : "2.37", + "Getopt::Long::Descriptive" : "0.081", + "Moose" : "0.56" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=MooseX-Getopt" + }, + "homepage" : "http://search.cpan.org/dist/MooseX-Getopt", + "repository" : { + "type" : "git", + "url" : "git://git.moose.perl.org/MooseX-Getopt.git" + } + }, + "version" : "0.35", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@FLORA/@Basic/GatherDir", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@FLORA/@Basic/PruneCruft", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@FLORA/@Basic/ManifestSkip", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@FLORA/@Basic/MetaYAML", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@FLORA/@Basic/License", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@FLORA/@Basic/Readme", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@FLORA/@Basic/ExtraTests", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@FLORA/@Basic/ExecDir", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@FLORA/@Basic/ShareDir", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@FLORA/@Basic/MakeMaker", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@FLORA/@Basic/Manifest", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@FLORA/@Basic/TestRelease", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@FLORA/@Basic/ConfirmRelease", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@FLORA/@Basic/UploadToCPAN", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@FLORA/MetaConfig", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@FLORA/MetaJSON", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@FLORA/PkgVersion", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@FLORA/PodSyntaxTests", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@FLORA/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@FLORA/PodCoverageTests", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@FLORA/MetaResources", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@FLORA/Authority", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@FLORA/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@FLORA/PodWeaver", + "version" : "3.101640" + }, + { + "class" : "Dist::Zilla::Plugin::Prereq", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "requires" + } + }, + "name" : "Prereq", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Prereq", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200001" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200001" + } + }, + "x_authority" : "cpan:STEVAN" + }, + "name" : "MooseX::Getopt", + "pathname" : "/authors/id/B/BO/BOBTFISH/MooseX-Getopt-0.35.tar.gz", + "provides" : { + "MooseX::Getopt" : { + "file" : "MooseX/Getopt.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Basic" : { + "file" : "MooseX/Getopt/Basic.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Dashes" : { + "file" : "MooseX/Getopt/Dashes.pm", + "version" : "0.35" + }, + "MooseX::Getopt::GLD" : { + "file" : "MooseX/Getopt/GLD.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Meta::Attribute" : { + "file" : "MooseX/Getopt/Meta/Attribute.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Meta::Attribute::NoGetopt" : { + "file" : "MooseX/Getopt/Meta/Attribute/NoGetopt.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Meta::Attribute::Trait" : { + "file" : "MooseX/Getopt/Meta/Attribute/Trait.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Meta::Attribute::Trait::NoGetopt" : { + "file" : "MooseX/Getopt/Meta/Attribute/Trait/NoGetopt.pm", + "version" : "0.35" + }, + "MooseX::Getopt::OptionTypeMap" : { + "file" : "MooseX/Getopt/OptionTypeMap.pm", + "version" : "0.35" + }, + "MooseX::Getopt::ProcessedArgv" : { + "file" : "MooseX/Getopt/ProcessedArgv.pm", + "version" : "0.35" + }, + "MooseX::Getopt::Strict" : { + "file" : "MooseX/Getopt/Strict.pm", + "version" : "0.35" + } + }, + "version" : "0.35" + }, + "MooseX::MethodAttributes" : { + "dist" : "MooseX-MethodAttributes-0.25", + "module" : "MooseX::MethodAttributes::Inheritable", + "mymeta" : { + "abstract" : "code attribute introspection", + "author" : [ + "Florian Ragwitz <rafl@debian.org>", + "Tomas Doran <bobtfish@bobtfish.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200007, CPAN::Meta::Converter version 2.110440, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-MethodAttributes", + "prereqs" : { + "build" : { + "requires" : { + "Test::Exception" : 0, + "Test::More" : "0.88", + "namespace::autoclean" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "Moose" : "0.98", + "MooseX::Types::Moose" : "0.21", + "namespace::clean" : "0.10" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=MooseX-MethodAttributes" + }, + "homepage" : "http://search.cpan.org/dist/MooseX-MethodAttributes", + "repository" : { + "type" : "git", + "url" : "git://github.com/rafl/moosex-methodattributes.git" + } + }, + "version" : "0.25", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::Prereq", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "requires" + } + }, + "name" : "Prereq", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::Prereq", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@FLORA/@Basic/GatherDir", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@FLORA/@Basic/PruneCruft", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@FLORA/@Basic/ManifestSkip", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@FLORA/@Basic/MetaYAML", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@FLORA/@Basic/License", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@FLORA/@Basic/Readme", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@FLORA/@Basic/ExtraTests", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@FLORA/@Basic/ExecDir", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@FLORA/@Basic/ShareDir", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@FLORA/@Basic/MakeMaker", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@FLORA/@Basic/Manifest", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@FLORA/@Basic/TestRelease", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@FLORA/@Basic/ConfirmRelease", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@FLORA/@Basic/UploadToCPAN", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@FLORA/MetaConfig", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@FLORA/MetaJSON", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@FLORA/PkgVersion", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@FLORA/PodSyntaxTests", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@FLORA/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@FLORA/PodCoverageTests", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@FLORA/MetaResources", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@FLORA/Authority", + "version" : "1.005" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@FLORA/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@FLORA/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200007" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "4.200007" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200007" + } + }, + "x_authority" : "cpan:FLORA" + }, + "name" : "MooseX::MethodAttributes", + "pathname" : "B/BO/BOBTFISH/MooseX-MethodAttributes-0.25.tar.gz", + "provides" : { + "MooseX::MethodAttributes" : { + "file" : "MooseX/MethodAttributes.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Inheritable" : { + "file" : "MooseX/MethodAttributes/Inheritable.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role" : { + "file" : "MooseX/MethodAttributes/Role.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::AttrContainer" : { + "file" : "MooseX/MethodAttributes/Role/AttrContainer.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::AttrContainer::Inheritable" : { + "file" : "MooseX/MethodAttributes/Role/AttrContainer/Inheritable.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Class" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Class.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Map" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Map.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Method" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Method.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Method::MaybeWrapped" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Method/MaybeWrapped.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Method::Wrapped" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Method/Wrapped.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Role" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Role.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Role::Application" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Role/Application.pm", + "version" : "0.25" + }, + "MooseX::MethodAttributes::Role::Meta::Role::Application::Summation" : { + "file" : "MooseX/MethodAttributes/Role/Meta/Role/Application/Summation.pm", + "version" : "0.25" + } + }, + "version" : "0.25" + }, + "MooseX::Role::WithOverloading" : { + "dist" : "MooseX-Role-WithOverloading-0.09", + "module" : "MooseX::Role::WithOverloading", + "mymeta" : { + "abstract" : "Roles which support overloading", + "author" : [ + "Florian Ragwitz <rafl@debian.org>", + "Tomas Doran <bobtfish@bobtfish.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200000, CPAN::Meta::Converter version 2.102400, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Role-WithOverloading", + "prereqs" : { + "build" : { + "requires" : { + "FindBin" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "Moose" : "0.94", + "Moose::Exporter" : 0, + "Moose::Role" : "1.15", + "Moose::Util::MetaRole" : 0, + "MooseX::Types::Moose" : 0, + "XSLoader" : 0, + "aliased" : 0, + "namespace::autoclean" : 0, + "namespace::clean" : 0, + "overload" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=MooseX-Role-WithOverloading" + }, + "homepage" : "http://search.cpan.org/dist/MooseX-Role-WithOverloading", + "repository" : { + "type" : "git", + "url" : "git://github.com/rafl/moosex-role-withoverloading.git" + } + }, + "version" : "0.09", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@FLORA/@Basic/GatherDir", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@FLORA/@Basic/PruneCruft", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@FLORA/@Basic/ManifestSkip", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@FLORA/@Basic/MetaYAML", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@FLORA/@Basic/License", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@FLORA/@Basic/Readme", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@FLORA/@Basic/ExtraTests", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@FLORA/@Basic/ExecDir", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@FLORA/@Basic/ShareDir", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@FLORA/@Basic/MakeMaker", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@FLORA/@Basic/Manifest", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@FLORA/@Basic/TestRelease", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@FLORA/@Basic/ConfirmRelease", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@FLORA/@Basic/UploadToCPAN", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@FLORA/MetaConfig", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@FLORA/MetaJSON", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@FLORA/PkgVersion", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@FLORA/PodSyntaxTests", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@FLORA/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@FLORA/PodCoverageTests", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@FLORA/MetaResources", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@FLORA/Authority", + "version" : "1.002" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@FLORA/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@FLORA/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@FLORA/AutoPrereqs", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200000" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200000" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200000" + } + }, + "x_authority" : "cpan:FLORA" + }, + "name" : "MooseX::Role::WithOverloading", + "pathname" : "F/FL/FLORA/MooseX-Role-WithOverloading-0.09.tar.gz", + "provides" : { + "MooseX::Role::WithOverloading" : { + "file" : "MooseX/Role/WithOverloading.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::Composite" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/Composite.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::Composite::ToClass" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/Composite/ToClass.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::Composite::ToInstance" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/Composite/ToInstance.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::Composite::ToRole" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/Composite/ToRole.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::FixOverloadedRefs" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/FixOverloadedRefs.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::ToClass" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/ToClass.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::ToInstance" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/ToInstance.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Application::ToRole" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Application/ToRole.pm", + "version" : "0.09" + }, + "MooseX::Role::WithOverloading::Meta::Role::Composite" : { + "file" : "MooseX/Role/WithOverloading/Meta/Role/Composite.pm", + "version" : "0.09" + } + }, + "version" : "0.09" + }, + "MooseX::Traits::Pluggable" : { + "dist" : "MooseX-Traits-Pluggable-0.10", + "module" : "MooseX::Traits::Pluggable", + "mymeta" : { + "abstract" : "trait loading and resolution for Moose", + "author" : [ + "Rafael Kitover C<< <rkitover@cpan.org> >>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Traits-Pluggable", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::Exception" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Class::MOP" : "0.84", + "List::MoreUtils" : 0, + "Moose" : 0, + "Moose::Role" : 0, + "Scalar::Util" : 0, + "Test::Exception" : 0, + "Test::More" : 0, + "namespace::autoclean" : 0 + } + } + }, + "provides" : { + "MooseX::Traits::Pluggable" : { + "file" : "lib/MooseX/Traits/Pluggable.pm", + "version" : "0.10" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/rkitover/moosex-traits-pluggable.git" + } + }, + "version" : "0.10" + }, + "name" : "MooseX::Traits::Pluggable", + "pathname" : "R/RK/RKITOVER/MooseX-Traits-Pluggable-0.10.tar.gz", + "provides" : { + "MooseX::Traits::Pluggable" : { + "file" : "MooseX/Traits/Pluggable.pm", + "version" : "0.10" + } + }, + "version" : "0.10" + }, + "MooseX::Types" : { + "dist" : "MooseX-Types-0.30", + "module" : "MooseX::Types::Moose", + "mymeta" : { + "abstract" : "Organise your Moose types in libraries", + "author" : [ + "Robert \"phaylon\" Sedlacek <rs@474.at>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300000, CPAN::Meta::Converter version 2.110930, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Types", + "prereqs" : { + "build" : { + "requires" : { + "FindBin" : 0, + "Test::Fatal" : 0, + "Test::Moose" : 0, + "Test::More" : "0.88", + "Test::Requires" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Carp::Clan" : "6.00", + "Moose" : "1.06", + "Scalar::Util" : "1.19", + "Sub::Install" : "0.924", + "Sub::Name" : 0, + "namespace::clean" : "0.19" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=MooseX-Types" + }, + "repository" : { + "type" : "git", + "url" : "git://git.moose.perl.org/MooseX-Types.git" + } + }, + "version" : "0.30" + }, + "name" : "MooseX::Types", + "pathname" : "D/DR/DROLSKY/MooseX-Types-0.30.tar.gz", + "provides" : { + "MooseX::Types" : { + "file" : "MooseX/Types.pm", + "version" : "0.30" + }, + "MooseX::Types::Base" : { + "file" : "MooseX/Types/Base.pm", + "version" : "0.30" + }, + "MooseX::Types::CheckedUtilExports" : { + "file" : "MooseX/Types/CheckedUtilExports.pm", + "version" : "0.30" + }, + "MooseX::Types::Combine" : { + "file" : "MooseX/Types/Combine.pm", + "version" : "0.30" + }, + "MooseX::Types::Moose" : { + "file" : "MooseX/Types/Moose.pm", + "version" : "0.30" + }, + "MooseX::Types::TypeDecorator" : { + "file" : "MooseX/Types/TypeDecorator.pm", + "version" : "0.30" + }, + "MooseX::Types::UndefinedType" : { + "file" : "MooseX/Types/UndefinedType.pm", + "version" : "0.30" + }, + "MooseX::Types::Util" : { + "file" : "MooseX/Types/Util.pm", + "version" : "0.30" + }, + "MooseX::Types::Wrapper" : { + "file" : "MooseX/Types/Wrapper.pm", + "version" : "0.30" + } + }, + "version" : "0.30" + }, + "MooseX::Types::Common" : { + "dist" : "MooseX-Types-Common-0.001004", + "module" : "MooseX::Types::Common::Numeric", + "mymeta" : { + "abstract" : "A library of commonly used type constraints", + "author" : [ + "This distribution was extracted from the L<Reaction> code base by Guillermo" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.04, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MooseX-Types-Common", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.36", + "Test::Fatal" : 0, + "Test::More" : "0.62" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.36" + } + }, + "runtime" : { + "requires" : { + "Moose" : "0.39", + "MooseX::Types" : "0.04" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.moose.perl.org/MooseX-Types-Common.git" + }, + "x_IRC" : "irc://irc.perl.org/#moose" + }, + "version" : "0.001004" + }, + "name" : "MooseX::Types::Common", + "pathname" : "A/AR/ARCANEZ/MooseX-Types-Common-0.001004.tar.gz", + "provides" : { + "MooseX::Types::Common" : { + "file" : "MooseX/Types/Common.pm", + "version" : "0.001004" + }, + "MooseX::Types::Common::Numeric" : { + "file" : "MooseX/Types/Common/Numeric.pm", + "version" : "0.001004" + }, + "MooseX::Types::Common::String" : { + "file" : "MooseX/Types/Common/String.pm", + "version" : "0.001004" + } + }, + "version" : "0.001004" + }, + "MyCPAN::App::DPAN" : { + "dist" : "MyCPAN-App-DPAN-1.28", + "module" : "MyCPAN::App::DPAN", + "mymeta" : { + "abstract" : "Create a custom, private DarkPAN repository that looks just like a real CPAN", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MyCPAN-App-DPAN", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "CPAN::Checksums" : 0, + "CPAN::PackageDetails" : "0.24", + "Log::Log4perl" : 0, + "MyCPAN::Indexer" : "1.28", + "Test::Output" : "0.13", + "version" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.28" + }, + "name" : "MyCPAN::App::DPAN", + "pathname" : "/authors/id/B/BD/BDFOY/MyCPAN-App-DPAN-1.28.tar.gz", + "provides" : { + "CPAN::Modulelist" : { + "file" : "MyCPAN/App/DPAN/Reporter/AsYAML.pm" + }, + "MyCPAN::App::DPAN" : { + "file" : "MyCPAN/App/DPAN.pm", + "version" : "1.28" + }, + "MyCPAN::App::DPAN::Indexer" : { + "file" : "MyCPAN/App/DPAN/Indexer.pm", + "version" : "1.28" + }, + "MyCPAN::App::DPAN::Reporter::AsYAML" : { + "file" : "MyCPAN/App/DPAN/Reporter/AsYAML.pm", + "version" : "1.28" + }, + "MyCPAN::App::DPAN::Reporter::Minimal" : { + "file" : "MyCPAN/App/DPAN/Reporter/Minimal.pm", + "version" : "1.28" + }, + "MyCPAN::App::DPAN::SkipQueue" : { + "file" : "MyCPAN/App/DPAN/SkipQueue.pm", + "version" : "1.28" + } + }, + "version" : "1.28" + }, + "MyCPAN::Indexer" : { + "dist" : "MyCPAN-Indexer-1.28", + "module" : "MyCPAN::Indexer", + "mymeta" : { + "abstract" : "Index a Perl distribution", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "MyCPAN-Indexer", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Archive::Extract" : 0, + "Archive::Tar" : 0, + "CPAN::Checksums" : 0, + "CPAN::PackageDetails" : "0.21", + "ConfigReader::Simple" : 0, + "Data::UUID" : 0, + "Digest::MD5" : 0, + "Distribution::Guess::BuildSystem" : "0.11", + "File::Find" : 0, + "File::Find::Closures" : 0, + "Log::Log4perl" : 0, + "Module::Extract::Namespaces" : "0.14", + "Module::Extract::Use" : "0.13", + "Module::Extract::VERSION" : "0.13", + "Parallel::ForkManager" : 0, + "Probe::Perl" : 0, + "Test::More" : 0, + "Test::Output" : "0.13", + "YAML" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "http://github.com/briandfoy/mycpan-indexer/tree/master", + "repository" : { + "type" : "git", + "url" : "git://github.com/briandfoy/mycpan-indexer.git" + } + }, + "version" : "1.28" + }, + "name" : "MyCPAN::Indexer", + "pathname" : "/authors/id/B/BD/BDFOY/MyCPAN-Indexer-1.28.tar.gz", + "provides" : { + "MyCPAN::App::BackPAN::Indexer" : { + "file" : "MyCPAN/App/BackPAN/Indexer.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer" : { + "file" : "MyCPAN/Indexer.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Component" : { + "file" : "MyCPAN/Indexer/Component.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Coordinator" : { + "file" : "MyCPAN/Indexer/Coordinator.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Dispatcher::Parallel" : { + "file" : "MyCPAN/Indexer/Dispatcher/Parallel.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Dispatcher::Serial" : { + "file" : "MyCPAN/Indexer/Dispatcher/Serial.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Interface::Curses" : { + "file" : "MyCPAN/Indexer/Interface/Curses.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Interface::Text" : { + "file" : "MyCPAN/Indexer/Interface/Text.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Interface::Tk" : { + "file" : "MyCPAN/Indexer/Interface/Tk.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Notes" : { + "file" : "MyCPAN/Indexer/Notes.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::NullTester" : { + "file" : "MyCPAN/Indexer/NullTester.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::NullTester::Dispatcher" : { + "file" : "MyCPAN/Indexer/NullTester.pm" + }, + "MyCPAN::Indexer::Queue" : { + "file" : "MyCPAN/Indexer/Queue.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Reporter::AsYAML" : { + "file" : "MyCPAN/Indexer/Reporter/AsYAML.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Reporter::Base" : { + "file" : "MyCPAN/Indexer/Reporter/Base.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::TestCensus" : { + "file" : "MyCPAN/Indexer/TestCensus.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Tutorial" : { + "file" : "MyCPAN/Indexer/Tutorial.pm", + "version" : "1.28" + }, + "MyCPAN::Indexer::Worker" : { + "file" : "MyCPAN/Indexer/Worker.pm", + "version" : "1.28" + } + }, + "version" : "1.28" + }, + "Net::Domain::TLD" : { + "dist" : "Net-Domain-TLD-1.68", + "module" : "Net::Domain::TLD", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Net-Domain-TLD", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Storable" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.68", + "x_installdirs" : "site", + "x_version_from" : "lib/Net/Domain/TLD.pm" + }, + "name" : "Net::Domain::TLD", + "pathname" : "/authors/id/A/AL/ALEXP/Net-Domain-TLD-1.68.tar.gz", + "provides" : { + "Net::Domain::TLD" : { + "file" : "Net/Domain/TLD.pm", + "version" : "1.68" + } + }, + "version" : "1.68" + }, + "Net::HTTP" : { + "dist" : "Net-HTTP-6.02", + "module" : "Net::HTTP", + "mymeta" : { + "abstract" : "Low-level HTTP connection (client)", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Net-HTTP", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "IO::Socket::SSL" : "1.38" + }, + "requires" : { + "Compress::Raw::Zlib" : 0, + "IO::Compress::Gzip" : 0, + "IO::Select" : 0, + "IO::Socket::INET" : 0, + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl/tree/Net-HTTP/master" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.02" + }, + "name" : "Net::HTTP", + "pathname" : "G/GA/GAAS/Net-HTTP-6.02.tar.gz", + "provides" : { + "Net::HTTP" : { + "file" : "Net/HTTP.pm", + "version" : "6.02" + }, + "Net::HTTP::Methods" : { + "file" : "Net/HTTP/Methods.pm", + "version" : "6.00" + }, + "Net::HTTP::NB" : { + "file" : "Net/HTTP/NB.pm", + "version" : "6.00" + }, + "Net::HTTPS" : { + "file" : "Net/HTTPS.pm", + "version" : "6.02" + } + }, + "version" : "6.02" + }, + "Number::Compare" : { + "dist" : "Number-Compare-0.03", + "module" : "Number::Compare", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Number-Compare", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.03" + }, + "name" : "Number::Compare", + "pathname" : "R/RC/RCLAMP/Number-Compare-0.03.tar.gz", + "provides" : { + "Number::Compare" : { + "file" : "Number/Compare.pm", + "version" : "0.03" + } + }, + "version" : "0.03" + }, + "Object::Signature" : { + "dist" : "Object-Signature-1.05", + "module" : "Object::Signature", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.64, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Object-Signature", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Digest::MD5" : "2.00", + "Storable" : "2.11", + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "1.05" + }, + "name" : "Object::Signature", + "pathname" : "/authors/id/A/AD/ADAMK/Object-Signature-1.05.tar.gz", + "provides" : { + "Object::Signature" : { + "file" : "Object/Signature.pm", + "version" : "1.05" + } + }, + "version" : "1.05" + }, + "PPI" : { + "dist" : "PPI-1.215", + "module" : "PPI", + "mymeta" : { + "abstract" : "Parse, Analyze and Manipulate Perl (without perl)", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "PPI", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Class::Inspector" : "1.22", + "ExtUtils::MakeMaker" : "6.42", + "File::Remove" : "1.42", + "Test::More" : "0.86", + "Test::NoWarnings" : "0.084", + "Test::Object" : "0.07", + "Test::SubCalls" : "1.07" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Clone" : "0.30", + "Digest::MD5" : "2.35", + "File::Spec" : "0.84", + "IO::String" : "1.07", + "List::MoreUtils" : "0.16", + "List::Util" : "1.20", + "Params::Util" : "1.00", + "Storable" : "2.17", + "Task::Weaken" : 0, + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/PPI" + }, + "x_ChangeLog" : "http://fisheye2.atlassian.com/changelog/cpan/trunk/PPI" + }, + "version" : "1.215", + "x_module_name" : "PPI" + }, + "name" : "PPI", + "pathname" : "/authors/id/A/AD/ADAMK/PPI-1.215.tar.gz", + "provides" : { + "PPI" : { + "file" : "PPI.pm", + "version" : "1.215" + }, + "PPI::Cache" : { + "file" : "PPI/Cache.pm", + "version" : "1.215" + }, + "PPI::Document" : { + "file" : "PPI/Document.pm", + "version" : "1.215" + }, + "PPI::Document::File" : { + "file" : "PPI/Document/File.pm", + "version" : "1.215" + }, + "PPI::Document::Fragment" : { + "file" : "PPI/Document/Fragment.pm", + "version" : "1.215" + }, + "PPI::Document::Normalized" : { + "file" : "PPI/Document/Normalized.pm", + "version" : "1.215" + }, + "PPI::Dumper" : { + "file" : "PPI/Dumper.pm", + "version" : "1.215" + }, + "PPI::Element" : { + "file" : "PPI/Element.pm", + "version" : "1.215" + }, + "PPI::Exception" : { + "file" : "PPI/Exception.pm", + "version" : "1.215" + }, + "PPI::Exception::ParserRejection" : { + "file" : "PPI/Exception/ParserRejection.pm", + "version" : "1.215" + }, + "PPI::Exception::ParserTimeout" : { + "file" : "PPI/Exception/ParserTimeout.pm", + "version" : "1.215" + }, + "PPI::Find" : { + "file" : "PPI/Find.pm", + "version" : "1.215" + }, + "PPI::Lexer" : { + "file" : "PPI/Lexer.pm", + "version" : "1.215" + }, + "PPI::Node" : { + "file" : "PPI/Node.pm", + "version" : "1.215" + }, + "PPI::Normal" : { + "file" : "PPI/Normal.pm", + "version" : "1.215" + }, + "PPI::Normal::Standard" : { + "file" : "PPI/Normal/Standard.pm", + "version" : "1.215" + }, + "PPI::Statement" : { + "file" : "PPI/Statement.pm", + "version" : "1.215" + }, + "PPI::Statement::Break" : { + "file" : "PPI/Statement/Break.pm", + "version" : "1.215" + }, + "PPI::Statement::Compound" : { + "file" : "PPI/Statement/Compound.pm", + "version" : "1.215" + }, + "PPI::Statement::Data" : { + "file" : "PPI/Statement/Data.pm", + "version" : "1.215" + }, + "PPI::Statement::End" : { + "file" : "PPI/Statement/End.pm", + "version" : "1.215" + }, + "PPI::Statement::Expression" : { + "file" : "PPI/Statement/Expression.pm", + "version" : "1.215" + }, + "PPI::Statement::Given" : { + "file" : "PPI/Statement/Given.pm", + "version" : "1.215" + }, + "PPI::Statement::Include" : { + "file" : "PPI/Statement/Include.pm", + "version" : "1.215" + }, + "PPI::Statement::Include::Perl6" : { + "file" : "PPI/Statement/Include/Perl6.pm", + "version" : "1.215" + }, + "PPI::Statement::Null" : { + "file" : "PPI/Statement/Null.pm", + "version" : "1.215" + }, + "PPI::Statement::Package" : { + "file" : "PPI/Statement/Package.pm", + "version" : "1.215" + }, + "PPI::Statement::Scheduled" : { + "file" : "PPI/Statement/Scheduled.pm", + "version" : "1.215" + }, + "PPI::Statement::Sub" : { + "file" : "PPI/Statement/Sub.pm", + "version" : "1.215" + }, + "PPI::Statement::Unknown" : { + "file" : "PPI/Statement/Unknown.pm", + "version" : "1.215" + }, + "PPI::Statement::UnmatchedBrace" : { + "file" : "PPI/Statement/UnmatchedBrace.pm", + "version" : "1.215" + }, + "PPI::Statement::Variable" : { + "file" : "PPI/Statement/Variable.pm", + "version" : "1.215" + }, + "PPI::Statement::When" : { + "file" : "PPI/Statement/When.pm", + "version" : "1.215" + }, + "PPI::Structure" : { + "file" : "PPI/Structure.pm", + "version" : "1.215" + }, + "PPI::Structure::Block" : { + "file" : "PPI/Structure/Block.pm", + "version" : "1.215" + }, + "PPI::Structure::Condition" : { + "file" : "PPI/Structure/Condition.pm", + "version" : "1.215" + }, + "PPI::Structure::Constructor" : { + "file" : "PPI/Structure/Constructor.pm", + "version" : "1.215" + }, + "PPI::Structure::For" : { + "file" : "PPI/Structure/For.pm", + "version" : "1.215" + }, + "PPI::Structure::Given" : { + "file" : "PPI/Structure/Given.pm", + "version" : "1.215" + }, + "PPI::Structure::List" : { + "file" : "PPI/Structure/List.pm", + "version" : "1.215" + }, + "PPI::Structure::Subscript" : { + "file" : "PPI/Structure/Subscript.pm", + "version" : "1.215" + }, + "PPI::Structure::Unknown" : { + "file" : "PPI/Structure/Unknown.pm", + "version" : "1.215" + }, + "PPI::Structure::When" : { + "file" : "PPI/Structure/When.pm", + "version" : "1.215" + }, + "PPI::Token" : { + "file" : "PPI/Token.pm", + "version" : "1.215" + }, + "PPI::Token::ArrayIndex" : { + "file" : "PPI/Token/ArrayIndex.pm", + "version" : "1.215" + }, + "PPI::Token::Attribute" : { + "file" : "PPI/Token/Attribute.pm", + "version" : "1.215" + }, + "PPI::Token::BOM" : { + "file" : "PPI/Token/BOM.pm", + "version" : "1.215" + }, + "PPI::Token::Cast" : { + "file" : "PPI/Token/Cast.pm", + "version" : "1.215" + }, + "PPI::Token::Comment" : { + "file" : "PPI/Token/Comment.pm", + "version" : "1.215" + }, + "PPI::Token::DashedWord" : { + "file" : "PPI/Token/DashedWord.pm", + "version" : "1.215" + }, + "PPI::Token::Data" : { + "file" : "PPI/Token/Data.pm", + "version" : "1.215" + }, + "PPI::Token::End" : { + "file" : "PPI/Token/End.pm", + "version" : "1.215" + }, + "PPI::Token::HereDoc" : { + "file" : "PPI/Token/HereDoc.pm", + "version" : "1.215" + }, + "PPI::Token::Label" : { + "file" : "PPI/Token/Label.pm", + "version" : "1.215" + }, + "PPI::Token::Magic" : { + "file" : "PPI/Token/Magic.pm", + "version" : "1.215" + }, + "PPI::Token::Number" : { + "file" : "PPI/Token/Number.pm", + "version" : "1.215" + }, + "PPI::Token::Number::Binary" : { + "file" : "PPI/Token/Number/Binary.pm", + "version" : "1.215" + }, + "PPI::Token::Number::Exp" : { + "file" : "PPI/Token/Number/Exp.pm", + "version" : "1.215" + }, + "PPI::Token::Number::Float" : { + "file" : "PPI/Token/Number/Float.pm", + "version" : "1.215" + }, + "PPI::Token::Number::Hex" : { + "file" : "PPI/Token/Number/Hex.pm", + "version" : "1.215" + }, + "PPI::Token::Number::Octal" : { + "file" : "PPI/Token/Number/Octal.pm", + "version" : "1.215" + }, + "PPI::Token::Number::Version" : { + "file" : "PPI/Token/Number/Version.pm", + "version" : "1.215" + }, + "PPI::Token::Operator" : { + "file" : "PPI/Token/Operator.pm", + "version" : "1.215" + }, + "PPI::Token::Pod" : { + "file" : "PPI/Token/Pod.pm", + "version" : "1.215" + }, + "PPI::Token::Prototype" : { + "file" : "PPI/Token/Prototype.pm", + "version" : "1.215" + }, + "PPI::Token::Quote" : { + "file" : "PPI/Token/Quote.pm", + "version" : "1.215" + }, + "PPI::Token::Quote::Double" : { + "file" : "PPI/Token/Quote/Double.pm", + "version" : "1.215" + }, + "PPI::Token::Quote::Interpolate" : { + "file" : "PPI/Token/Quote/Interpolate.pm", + "version" : "1.215" + }, + "PPI::Token::Quote::Literal" : { + "file" : "PPI/Token/Quote/Literal.pm", + "version" : "1.215" + }, + "PPI::Token::Quote::Single" : { + "file" : "PPI/Token/Quote/Single.pm", + "version" : "1.215" + }, + "PPI::Token::QuoteLike" : { + "file" : "PPI/Token/QuoteLike.pm", + "version" : "1.215" + }, + "PPI::Token::QuoteLike::Backtick" : { + "file" : "PPI/Token/QuoteLike/Backtick.pm", + "version" : "1.215" + }, + "PPI::Token::QuoteLike::Command" : { + "file" : "PPI/Token/QuoteLike/Command.pm", + "version" : "1.215" + }, + "PPI::Token::QuoteLike::Readline" : { + "file" : "PPI/Token/QuoteLike/Readline.pm", + "version" : "1.215" + }, + "PPI::Token::QuoteLike::Regexp" : { + "file" : "PPI/Token/QuoteLike/Regexp.pm", + "version" : "1.215" + }, + "PPI::Token::QuoteLike::Words" : { + "file" : "PPI/Token/QuoteLike/Words.pm", + "version" : "1.215" + }, + "PPI::Token::Regexp" : { + "file" : "PPI/Token/Regexp.pm", + "version" : "1.215" + }, + "PPI::Token::Regexp::Match" : { + "file" : "PPI/Token/Regexp/Match.pm", + "version" : "1.215" + }, + "PPI::Token::Regexp::Substitute" : { + "file" : "PPI/Token/Regexp/Substitute.pm", + "version" : "1.215" + }, + "PPI::Token::Regexp::Transliterate" : { + "file" : "PPI/Token/Regexp/Transliterate.pm", + "version" : "1.215" + }, + "PPI::Token::Separator" : { + "file" : "PPI/Token/Separator.pm", + "version" : "1.215" + }, + "PPI::Token::Structure" : { + "file" : "PPI/Token/Structure.pm", + "version" : "1.215" + }, + "PPI::Token::Symbol" : { + "file" : "PPI/Token/Symbol.pm", + "version" : "1.215" + }, + "PPI::Token::Unknown" : { + "file" : "PPI/Token/Unknown.pm", + "version" : "1.215" + }, + "PPI::Token::Whitespace" : { + "file" : "PPI/Token/Whitespace.pm", + "version" : "1.215" + }, + "PPI::Token::Word" : { + "file" : "PPI/Token/Word.pm", + "version" : "1.215" + }, + "PPI::Tokenizer" : { + "file" : "PPI/Tokenizer.pm", + "version" : "1.215" + }, + "PPI::Transform" : { + "file" : "PPI/Transform.pm", + "version" : "1.215" + }, + "PPI::Transform::UpdateCopyright" : { + "file" : "PPI/Transform/UpdateCopyright.pm", + "version" : "1.215" + }, + "PPI::Util" : { + "file" : "PPI/Util.pm", + "version" : "1.215" + }, + "PPI::XSAccessor" : { + "file" : "PPI/XSAccessor.pm", + "version" : "1.215" + } + }, + "version" : "1.215" + }, + "Package::DeprecationManager" : { + "dist" : "Package-DeprecationManager-0.11", + "module" : "Package::DeprecationManager", + "mymeta" : { + "abstract" : "Manage deprecation warnings for your distribution", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200006, CPAN::Meta::Converter version 2.110930, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Package-DeprecationManager", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : 0, + "Test::More" : "0.88", + "Test::Requires" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "List::MoreUtils" : 0, + "Params::Util" : 0, + "Sub::Install" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Package-DeprecationManager" + }, + "repository" : { + "type" : "git", + "url" : "git://git.moose.perl.org/Package-DeprecationManager.git" + } + }, + "version" : "0.11" + }, + "name" : "Package::DeprecationManager", + "pathname" : "D/DR/DROLSKY/Package-DeprecationManager-0.11.tar.gz", + "provides" : { + "Package::DeprecationManager" : { + "file" : "Package/DeprecationManager.pm", + "version" : "0.11" + } + }, + "version" : "0.11" + }, + "Package::Stash" : { + "dist" : "Package-Stash-0.33", + "module" : "Package::Stash", + "mymeta" : { + "abstract" : "routines for manipulating stashes", + "author" : [ + "Jesse Luehrs <doy at tozt dot net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300002, CPAN::Meta::Converter version 2.110440, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Package-Stash", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : 0, + "Test::More" : "0.88", + "Test::Requires" : 0 + } + }, + "configure" : { + "requires" : { + "Dist::CheckConflicts" : "0.02", + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "recommends" : { + "Package::Stash::XS" : "0.24" + }, + "requires" : { + "Dist::CheckConflicts" : "0.02", + "Package::DeprecationManager" : 0, + "Package::Stash::XS" : "0.24", + "Scalar::Util" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/doy/package-stash.git" + } + }, + "version" : "0.33", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@DOY/TestMoreDoneTesting", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@DOY/GatherDir", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@DOY/PruneCruft", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@DOY/ManifestSkip", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@DOY/MetaYAML", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@DOY/License", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@DOY/Readme", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@DOY/ExtraTests", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@DOY/ExecDir", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@DOY/ShareDir", + "version" : "4.300002" + }, + { + "class" : "inc::MMPackageStash", + "name" : "@DOY/=inc::MMPackageStash", + "version" : null + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@DOY/Manifest", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@DOY/TestRelease", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@DOY/ConfirmRelease", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@DOY/MetaConfig", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@DOY/MetaJSON", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@DOY/NextRelease", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::CheckChangesHasContent", + "name" : "@DOY/CheckChangesHasContent", + "version" : "0.003" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@DOY/PkgVersion", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@DOY/PodCoverageTests", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@DOY/PodSyntaxTests", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@DOY/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@DOY/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::CompileTests", + "name" : "@DOY/CompileTests", + "version" : "1.110930" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@DOY/Repository", + "version" : "0.18" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@DOY/Git::Check", + "version" : "1.111590" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@DOY/Git::Tag", + "version" : "1.111590" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@DOY/Git::NextVersion", + "version" : "1.111590" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@DOY/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@DOY/UploadToCPAN", + "version" : "4.300002" + }, + { + "class" : "inc::DistMeta", + "name" : "=inc::DistMeta", + "version" : null + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "requires" + } + }, + "name" : "Prereqs", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "recommends" + } + }, + "name" : "RuntimeRecommends", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "develop", + "type" : "requires" + } + }, + "name" : "DevelopRequires", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::Conflicts", + "name" : "Conflicts", + "version" : "0.08" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.300002" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "4.300002" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : "0" + }, + "version" : "4.300002" + } + }, + "x_conflicts" : { + "Class::MOP" : "1.08", + "MooseX::Method::Signatures" : "0.36", + "MooseX::Role::WithOverloading" : "0.08", + "namespace::clean" : "0.18" + } + }, + "name" : "Package::Stash", + "pathname" : "D/DO/DOY/Package-Stash-0.33.tar.gz", + "provides" : { + "Package::Stash" : { + "file" : "Package/Stash.pm", + "version" : "0.33" + }, + "Package::Stash::PP" : { + "file" : "Package/Stash/PP.pm", + "version" : "0.33" + } + }, + "version" : "0.33" + }, + "Package::Stash::XS" : { + "dist" : "Package-Stash-XS-0.25", + "module" : "Package::Stash::XS", + "mymeta" : { + "abstract" : "faster and more correct implementation of the Package::Stash API", + "author" : [ + "Jesse Luehrs <doy at tozt dot net>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200012, CPAN::Meta::Converter version 2.110440, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Package-Stash-XS", + "prereqs" : { + "build" : { + "requires" : { + "Test::Fatal" : 0, + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/doy/package-stash-xs.git" + } + }, + "version" : "0.25", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@DOY/TestMoreDoneTesting", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@DOY/GatherDir", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@DOY/PruneCruft", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@DOY/ManifestSkip", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@DOY/MetaYAML", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@DOY/License", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@DOY/Readme", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@DOY/ExtraTests", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@DOY/ExecDir", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@DOY/ShareDir", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@DOY/MakeMaker", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@DOY/Manifest", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@DOY/TestRelease", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@DOY/ConfirmRelease", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@DOY/MetaConfig", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@DOY/MetaJSON", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@DOY/NextRelease", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::CheckChangesHasContent", + "name" : "@DOY/CheckChangesHasContent", + "version" : "0.003" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@DOY/PkgVersion", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@DOY/PodCoverageTests", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@DOY/PodSyntaxTests", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@DOY/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@DOY/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::CompileTests", + "name" : "@DOY/CompileTests", + "version" : "1.110930" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@DOY/Repository", + "version" : "0.18" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@DOY/Git::Check", + "version" : "1.111590" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@DOY/Git::Tag", + "version" : "1.111590" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@DOY/Git::NextVersion", + "version" : "1.111590" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@DOY/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@DOY/UploadToCPAN", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "runtime", + "type" : "requires" + } + }, + "name" : "Prereqs", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "develop", + "type" : "requires" + } + }, + "name" : "DevelopRequires", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::PruneFiles", + "name" : "PruneFiles", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200012" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "4.200012" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : "0" + }, + "version" : "4.200012" + } + } + }, + "name" : "Package::Stash::XS", + "pathname" : "D/DO/DOY/Package-Stash-XS-0.25.tar.gz", + "provides" : { + "Package::Stash::XS" : { + "file" : "Package/Stash/XS.pm", + "version" : "0.25" + } + }, + "version" : "0.25" + }, + "Parallel::ForkManager" : { + "dist" : "Parallel-ForkManager-0.7.9", + "module" : "Parallel::ForkManager", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Parallel-ForkManager", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "0.7.9" + }, + "name" : "Parallel::ForkManager", + "pathname" : "D/DL/DLUX/Parallel-ForkManager-0.7.9.tar.gz", + "provides" : { + "Parallel::ForkManager" : { + "file" : "Parallel/ForkManager.pm", + "version" : "v0.7.9" + } + }, + "version" : "v0.7.9" + }, + "Params::Classify" : { + "dist" : "Params-Classify-0.013", + "module" : "Params::Classify", + "mymeta" : { + "abstract" : "argument type classification", + "author" : [ + "Andrew Main (Zefram) <zefram@fysh.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Params-Classify", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::ParseXS" : "2.2006", + "Module::Build" : 0, + "Test::More" : 0, + "perl" : "5.006001", + "strict" : 0, + "warnings" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : 0, + "perl" : "5.006001", + "strict" : 0, + "warnings" : 0 + } + }, + "runtime" : { + "recommends" : { + "XSLoader" : 0 + }, + "requires" : { + "Exporter" : 0, + "Scalar::Util" : "1.01", + "parent" : 0, + "perl" : "5.006001", + "strict" : 0, + "warnings" : 0 + } + } + }, + "provides" : { + "Params::Classify" : { + "file" : "lib/Params/Classify.pm", + "version" : "0.013" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.013" + }, + "name" : "Params::Classify", + "pathname" : "Z/ZE/ZEFRAM/Params-Classify-0.013.tar.gz", + "provides" : { + "Params::Classify" : { + "file" : "Params/Classify.pm", + "version" : "0.013" + } + }, + "version" : "0.013" + }, + "Params::Util" : { + "dist" : "Params-Util-1.03", + "module" : "Params::Util", + "mymeta" : { + "abstract" : "Simple, compact and correct param-checking functions", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Params-Util", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.52", + "File::Spec" : "0.80", + "Test::More" : "0.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::CBuilder" : "0.27", + "ExtUtils::MakeMaker" : "6.52" + } + }, + "runtime" : { + "requires" : { + "Scalar::Util" : "1.18", + "perl" : "5.00503" + } + } + }, + "release_status" : "stable", + "version" : "1.03" + }, + "name" : "Params::Util", + "pathname" : "/authors/id/A/AD/ADAMK/Params-Util-1.03.tar.gz", + "provides" : { + "Params::Util" : { + "file" : "Params/Util.pm", + "version" : "1.03" + } + }, + "version" : "1.03" + }, + "Params::Validate" : { + "dist" : "Params-Validate-1.00", + "module" : "Params::Validate", + "mymeta" : { + "abstract" : "Validate method/function parameters", + "author" : [ + "Dave Rolsky, <autarch@urth.org> and Ilya Martynov <ilya@martynov.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Params-Validate", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::CBuilder" : 0, + "Module::Build" : "0.3601", + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.3601" + } + }, + "runtime" : { + "requires" : { + "Attribute::Handlers" : "0.79", + "Scalar::Util" : "1.10", + "perl" : "v5.8.1" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Params-Validate" + }, + "repository" : { + "type" : "git", + "url" : "git://git.urth.org/Params-Validate.git" + } + }, + "version" : "1.00" + }, + "name" : "Params::Validate", + "pathname" : "D/DR/DROLSKY/Params-Validate-1.00.tar.gz", + "provides" : { + "Attribute::Params::Validate" : { + "file" : "Attribute/Params/Validate.pm", + "version" : "1.07" + }, + "Params::Validate" : { + "file" : "Params/Validate.pm", + "version" : "1.00" + } + }, + "version" : "1.00" + }, + "Path::Class" : { + "dist" : "Path-Class-0.24", + "module" : "Path::Class", + "mymeta" : { + "abstract" : "Cross-platform path specification manipulation", + "author" : [ + "Ken Williams <kwilliams@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Path-Class", + "prereqs" : { + "build" : { + "requires" : { + "Module::Build" : "0.3601", + "Test" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30", + "Module::Build" : "0.3601" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Cwd" : 0, + "Exporter" : 0, + "File::Path" : 0, + "File::Spec" : "0.87", + "File::Temp" : 0, + "File::stat" : 0, + "IO::Dir" : 0, + "IO::File" : 0, + "overload" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=Path-Class" + }, + "repository" : { + "url" : "http://perl-path-class.googlecode.com/svn/trunk" + } + }, + "version" : "0.24" + }, + "name" : "Path::Class", + "pathname" : "K/KW/KWILLIAMS/Path-Class-0.24.tar.gz", + "provides" : { + "Path::Class" : { + "file" : "Path/Class.pm", + "version" : "0.24" + }, + "Path::Class::Dir" : { + "file" : "Path/Class/Dir.pm", + "version" : "0.24" + }, + "Path::Class::Entity" : { + "file" : "Path/Class/Entity.pm", + "version" : "0.24" + }, + "Path::Class::File" : { + "file" : "Path/Class/File.pm", + "version" : "0.24" + } + }, + "version" : "0.24" + }, + "Probe::Perl" : { + "dist" : "Probe-Perl-0.01", + "module" : "Probe::Perl", + "mymeta" : { + "abstract" : "Information about the currently running perl", + "author" : [ + "Randy W. Sims <randys@thepierianspring.org>", + "Based partly on code from the Module::Build project, by Ken Williams\n<kwilliams@cpan.org> and others." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Probe-Perl", + "prereqs" : { + "build" : { + "requires" : { + "Test" : 0 + } + }, + "runtime" : { + "requires" : { + "Config" : 0 + } + } + }, + "provides" : { + "Probe::Perl" : { + "file" : "lib/Probe/Perl.pm", + "version" : "0.01" + } + }, + "release_status" : "stable", + "version" : "0.01" + }, + "name" : "Probe::Perl", + "pathname" : "K/KW/KWILLIAMS/Probe-Perl-0.01.tar.gz", + "provides" : { + "Probe::Perl" : { + "file" : "Probe/Perl.pm", + "version" : "0.01" + } + }, + "version" : "0.01" + }, + "Readonly" : { + "dist" : "Readonly-1.03", + "module" : "Readonly", + "mymeta" : { + "abstract" : "Facility for creating read-only scalars, arrays, hashes.", + "author" : [ + "Eric J. Roode <roode@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Readonly", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.03" + }, + "name" : "Readonly", + "pathname" : "R/RO/ROODE/Readonly-1.03.tar.gz", + "provides" : { + "Readonly" : { + "file" : "Readonly.pm", + "version" : "1.03" + }, + "Readonly::Array" : { + "file" : "Readonly.pm" + }, + "Readonly::Hash" : { + "file" : "Readonly.pm" + }, + "Readonly::Scalar" : { + "file" : "Readonly.pm" + } + }, + "version" : "1.03" + }, + "Regexp::Common" : { + "dist" : "Regexp-Common-2011121001", + "module" : "Regexp::Common", + "mymeta" : { + "abstract" : "Provide commonly requested regular expressions", + "author" : [ + "Abigail <regexp-common@abigail.be>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "keywords" : [ + "regular expression", + "pattern" + ], + "license" : [ + "mit" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Regexp-Common", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0, + "strict" : 0 + } + }, + "runtime" : { + "requires" : { + "perl" : "5.00473", + "strict" : 0, + "vars" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://github.com/Abigail/Regexp--Common.git" + } + }, + "version" : "2011121001", + "x_test_requires" : { + "strict" : "0" + } + }, + "name" : "Regexp::Common", + "pathname" : "A/AB/ABIGAIL/Regexp-Common-2011121001.tar.gz", + "provides" : { + "Regexp::Common" : { + "file" : "Regexp/Common.pm", + "version" : "2011121001" + }, + "Regexp::Common::CC" : { + "file" : "Regexp/Common/CC.pm", + "version" : "2010010201" + }, + "Regexp::Common::Entry" : { + "file" : "Regexp/Common.pm" + }, + "Regexp::Common::SEN" : { + "file" : "Regexp/Common/SEN.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI" : { + "file" : "Regexp/Common/URI.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::RFC1035" : { + "file" : "Regexp/Common/URI/RFC1035.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::RFC1738" : { + "file" : "Regexp/Common/URI/RFC1738.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::RFC1808" : { + "file" : "Regexp/Common/URI/RFC1808.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::RFC2384" : { + "file" : "Regexp/Common/URI/RFC2384.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::RFC2396" : { + "file" : "Regexp/Common/URI/RFC2396.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::RFC2806" : { + "file" : "Regexp/Common/URI/RFC2806.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::fax" : { + "file" : "Regexp/Common/URI/fax.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::file" : { + "file" : "Regexp/Common/URI/file.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::ftp" : { + "file" : "Regexp/Common/URI/ftp.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::gopher" : { + "file" : "Regexp/Common/URI/gopher.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::http" : { + "file" : "Regexp/Common/URI/http.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::news" : { + "file" : "Regexp/Common/URI/news.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::pop" : { + "file" : "Regexp/Common/URI/pop.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::prospero" : { + "file" : "Regexp/Common/URI/prospero.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::tel" : { + "file" : "Regexp/Common/URI/tel.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::telnet" : { + "file" : "Regexp/Common/URI/telnet.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::tv" : { + "file" : "Regexp/Common/URI/tv.pm", + "version" : "2010010201" + }, + "Regexp::Common::URI::wais" : { + "file" : "Regexp/Common/URI/wais.pm", + "version" : "2010010201" + }, + "Regexp::Common::balanced" : { + "file" : "Regexp/Common/balanced.pm", + "version" : "2010010201" + }, + "Regexp::Common::comment" : { + "file" : "Regexp/Common/comment.pm", + "version" : "2010010201" + }, + "Regexp::Common::delimited" : { + "file" : "Regexp/Common/delimited.pm", + "version" : "2010010201" + }, + "Regexp::Common::lingua" : { + "file" : "Regexp/Common/lingua.pm", + "version" : "2010010201" + }, + "Regexp::Common::list" : { + "file" : "Regexp/Common/list.pm", + "version" : "2010010201" + }, + "Regexp::Common::net" : { + "file" : "Regexp/Common/net.pm", + "version" : "2010010201" + }, + "Regexp::Common::number" : { + "file" : "Regexp/Common/number.pm", + "version" : "2010010201" + }, + "Regexp::Common::profanity" : { + "file" : "Regexp/Common/profanity.pm", + "version" : "2010010201" + }, + "Regexp::Common::whitespace" : { + "file" : "Regexp/Common/whitespace.pm", + "version" : "2010010201" + }, + "Regexp::Common::zip" : { + "file" : "Regexp/Common/zip.pm", + "version" : "2010010201" + } + }, + "version" : "2011121001" + }, + "Return::Value" : { + "dist" : "Return-Value-1.666001", + "module" : "Return::Value", + "mymeta" : { + "abstract" : "Polymorphic Return Values", + "author" : [ + "Casey West <casey@geeknest.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Return-Value", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "1.666001" + }, + "name" : "Return::Value", + "pathname" : "R/RJ/RJBS/Return-Value-1.666001.tar.gz", + "provides" : { + "Return::Value" : { + "file" : "Return/Value.pm", + "version" : "1.666001" + } + }, + "version" : "1.666001" + }, + "SQL::Abstract" : { + "dist" : "SQL-Abstract-1.72", + "module" : "SQL::Abstract", + "mymeta" : { + "abstract" : "Generate SQL from Perl data structures", + "author" : [ + "Nathan Wiger <nate@wiger.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "SQL-Abstract", + "no_index" : { + "directory" : [ + "examples", + "inc", + "t" + ], + "package" : [ + "DBIx::Class::Storage::Debug::PrettyPrint" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Storable" : 0, + "Test::Deep" : "0.106", + "Test::Exception" : 0, + "Test::More" : "0.92", + "Test::Warn" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Class::Accessor::Grouped" : "0.10002", + "Getopt::Long::Descriptive" : "0.086", + "Hash::Merge" : "0.12", + "List::Util" : 0, + "Scalar::Util" : 0, + "Storable" : 0, + "Test::Deep" : "0.106", + "Test::Exception" : 0, + "Test::More" : "0.92", + "Test::Warn" : 0, + "perl" : "5.006002" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=SQL-Abstract" + }, + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/dbsrgits/SQL-Abstract.git" + } + }, + "version" : "1.72" + }, + "name" : "SQL::Abstract", + "pathname" : "F/FR/FREW/SQL-Abstract-1.72.tar.gz", + "provides" : { + "DBIx::Class::Storage::Debug::PrettyPrint" : { + "file" : "DBIx/Class/Storage/Debug/PrettyPrint.pm" + }, + "SQL::Abstract" : { + "file" : "SQL/Abstract.pm", + "version" : "1.72" + }, + "SQL::Abstract::Test" : { + "file" : "SQL/Abstract/Test.pm" + }, + "SQL::Abstract::Tree" : { + "file" : "SQL/Abstract/Tree.pm" + } + }, + "version" : "1.72" + }, + "Scope::Guard" : { + "dist" : "Scope-Guard-0.20", + "module" : "Scope::Guard", + "mymeta" : { + "abstract" : "lexically-scoped resource management", + "author" : [ + "chocolateboy <chocolate@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Scope-Guard", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "perl" : "5.006001" + } + } + }, + "release_status" : "stable", + "version" : "0.20" + }, + "name" : "Scope::Guard", + "pathname" : "/authors/id/C/CH/CHOCOLATE/Scope-Guard-0.20.tar.gz", + "provides" : { + "Scope::Guard" : { + "file" : "Scope/Guard.pm", + "version" : "0.20" + } + }, + "version" : "0.20" + }, + "Sort::Key" : { + "dist" : "Sort-Key-1.28", + "module" : "Sort::Key", + "mymeta" : { + "abstract" : "the fastest way to sort anything in Perl", + "author" : [ + "Salvador Fandino <sfandino@yahoo.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.32, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sort-Key", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.54" + } + } + }, + "release_status" : "stable", + "version" : "1.28" + }, + "name" : "Sort::Key", + "pathname" : "S/SA/SALVA/Sort-Key-1.28.tar.gz", + "provides" : { + "Sort::Key" : { + "file" : "Sort/Key.pm", + "version" : "1.28" + }, + "Sort::Key::Maker" : { + "file" : "Sort/Key/Maker.pm", + "version" : "0.02" + }, + "Sort::Key::Multi" : { + "file" : "Sort/Key/Multi.pm", + "version" : "1.25" + }, + "Sort::Key::Natural" : { + "file" : "Sort/Key/Natural.pm", + "version" : "0.03" + }, + "Sort::Key::Register" : { + "file" : "Sort/Key/Register.pm", + "version" : "0.14" + } + }, + "version" : "1.28" + }, + "Spiffy" : { + "dist" : "Spiffy-0.30", + "module" : "Spiffy", + "mymeta" : { + "abstract" : "Spiffy Perl Interface Framework For You", + "author" : [ + "Ingy döt Net <ingy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.54, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Spiffy", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Filter::Util::Call" : 0, + "Scalar::Util" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.25" + }, + "name" : "Spiffy", + "pathname" : "I/IN/INGY/Spiffy-0.30.tar.gz", + "provides" : { + "Spiffy" : { + "file" : "Spiffy.pm", + "version" : "0.30" + } + }, + "version" : "0.30" + }, + "Statistics::Distributions" : { + "dist" : "Statistics-Distributions-1.02", + "module" : "Statistics::Distributions", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Statistics-Distributions", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.02" + }, + "name" : "Statistics::Distributions", + "pathname" : "M/MI/MIKEK/Statistics-Distributions-1.02.tar.gz", + "provides" : { + "Statistics::Distributions" : { + "file" : "Statistics/Distributions.pm", + "version" : "1.02" + } + }, + "version" : "1.02" + }, + "String::CRC32" : { + "dist" : "String-CRC32-1.4", + "module" : "String::CRC32", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "String-CRC32", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.4" + }, + "name" : "String::CRC32", + "pathname" : "S/SO/SOENKE/String-CRC32-1.4.tar.gz", + "provides" : { + "String::CRC32" : { + "file" : "String/CRC32.pm", + "version" : "1.4" + } + }, + "version" : "1.4" + }, + "String::RewritePrefix" : { + "dist" : "String-RewritePrefix-0.006", + "module" : "String::RewritePrefix", + "mymeta" : { + "abstract" : "rewrite strings based on a set of known prefixes", + "author" : [ + "Ricardo Signes <rjbs@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.102342, CPAN::Meta::Converter version 2.102400, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "String-RewritePrefix", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.96" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Sub::Exporter" : "0.972" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "type" : "git", + "url" : "git://git.codesimply.com/String-RewritePrefix.git" + } + }, + "version" : "0.006", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@RJBS/@Basic/GatherDir", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@RJBS/@Basic/PruneCruft", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@RJBS/@Basic/ManifestSkip", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@RJBS/@Basic/MetaYAML", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@RJBS/@Basic/License", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@RJBS/@Basic/Readme", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@RJBS/@Basic/ExtraTests", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@RJBS/@Basic/ExecDir", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@RJBS/@Basic/ShareDir", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@RJBS/@Basic/MakeMaker", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@RJBS/@Basic/Manifest", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@RJBS/@Basic/TestRelease", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@RJBS/@Basic/ConfirmRelease", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@RJBS/@Basic/UploadToCPAN", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@RJBS/AutoPrereqs", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@RJBS/Git::NextVersion", + "version" : "1.102810" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@RJBS/PkgVersion", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@RJBS/MetaConfig", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@RJBS/MetaJSON", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@RJBS/NextRelease", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@RJBS/PodSyntaxTests", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@RJBS/Repository", + "version" : "0.14" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@RJBS/TestMoreWithSubtests", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@RJBS/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@RJBS/@Git/Check", + "version" : "1.102810" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "name" : "@RJBS/@Git/Commit", + "version" : "1.102810" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@RJBS/@Git/Tag", + "version" : "1.102810" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "name" : "@RJBS/@Git/Push", + "version" : "1.102810" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.102342" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.102342" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.102342" + } + } + }, + "name" : "String::RewritePrefix", + "pathname" : "R/RJ/RJBS/String-RewritePrefix-0.006.tar.gz", + "provides" : { + "String::RewritePrefix" : { + "file" : "String/RewritePrefix.pm", + "version" : "0.006" + } + }, + "version" : "0.006" + }, + "Sub::Exporter" : { + "dist" : "Sub-Exporter-0.982", + "module" : "Sub::Exporter", + "mymeta" : { + "abstract" : "a sophisticated exporter for custom-built routines", + "author" : [ + "Ricardo SIGNES, C<< <rjbs@cpan.org> >>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.77, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sub-Exporter", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Data::OptList" : "0.1", + "ExtUtils::MakeMaker" : "6.62", + "Params::Util" : "0.14", + "Sub::Install" : "0.92" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/rjbs/sub-exporter" + } + }, + "version" : "0.982", + "x_module_name" : "Sub::Exporter" + }, + "name" : "Sub::Exporter", + "pathname" : "R/RJ/RJBS/Sub-Exporter-0.982.tar.gz", + "provides" : { + "Sub::Exporter" : { + "file" : "Sub/Exporter.pm", + "version" : "0.982" + }, + "Sub::Exporter::Util" : { + "file" : "Sub/Exporter/Util.pm", + "version" : "0.982" + } + }, + "version" : "0.982" + }, + "Sub::Install" : { + "dist" : "Sub-Install-0.925", + "module" : "Sub::Install", + "mymeta" : { + "abstract" : "install subroutines into packages easily", + "author" : [ + "Ricardo Signes <rjbs@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sub-Install", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Scalar::Util" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "x_Repository" : "http://github.com/rjbs/sub-install" + }, + "version" : "0.925" + }, + "name" : "Sub::Install", + "pathname" : "R/RJ/RJBS/Sub-Install-0.925.tar.gz", + "provides" : { + "Sub::Install" : { + "file" : "Sub/Install.pm", + "version" : "0.925" + } + }, + "version" : "0.925" + }, + "Sub::Name" : { + "dist" : "Sub-Name-0.05", + "module" : "Sub::Name", + "mymeta" : { + "abstract" : "(re)name a sub", + "author" : [ + "Matthijs van Duin <xmath@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sub-Name", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "0.05" + }, + "name" : "Sub::Name", + "pathname" : "F/FL/FLORA/Sub-Name-0.05.tar.gz", + "provides" : { + "Sub::Name" : { + "file" : "Sub/Name.pm", + "version" : "0.05" + } + }, + "version" : "0.05" + }, + "Sub::Override" : { + "dist" : "Sub-Override-0.08", + "module" : "Sub::Override", + "mymeta" : { + "abstract" : "Perl extension for easily overriding subroutines", + "author" : [ + "Curtis Poe <eop_divo_sitruc@yahoo.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sub-Override", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Sub::Uplevel" : 0, + "Test::Exception" : "0.21", + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "0.08" + }, + "name" : "Sub::Override", + "pathname" : "O/OV/OVID/Sub-Override-0.08.tar.gz", + "provides" : { + "Sub::Override" : { + "file" : "Sub/Override.pm", + "version" : "0.08" + } + }, + "version" : "0.08" + }, + "Sub::Uplevel" : { + "dist" : "Sub-Uplevel-0.22", + "module" : "Sub::Uplevel", + "mymeta" : { + "abstract" : "apparently run a function in a higher stack frame", + "author" : [ + "David A. Golden <dagolden@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Sub-Uplevel", + "no_index" : { + "directory" : [ + "examples", + "inc" + ], + "package" : [ + "DB" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Carp" : 0, + "Test::More" : "0.47" + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.35" + } + }, + "runtime" : { + "requires" : { + "perl" : "5.006" + } + } + }, + "provides" : { + "DB" : { + "file" : "lib/Sub/Uplevel.pm", + "version" : 0 + }, + "Sub::Uplevel" : { + "file" : "lib/Sub/Uplevel.pm", + "version" : "0.22" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/dagolden/sub-uplevel" + } + }, + "version" : "0.22" + }, + "name" : "Sub::Uplevel", + "pathname" : "D/DA/DAGOLDEN/Sub-Uplevel-0.22.tar.gz", + "provides" : { + "Sub::Uplevel" : { + "file" : "Sub/Uplevel.pm", + "version" : "0.22" + } + }, + "version" : "0.22" + }, + "Task::Weaken" : { + "dist" : "Task-Weaken-1.04", + "module" : "Task::Weaken", + "mymeta" : { + "abstract" : "Ensure that a platform has weaken support", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Task-Weaken", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "File::Spec" : "0.80", + "Test::More" : "0.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Scalar::Util" : "1.14", + "perl" : "5.005" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/Task-Weaken" + }, + "x_ChangeLog" : "http://fisheye2.atlassian.com/changelog/cpan/trunk/Task-Weaken" + }, + "version" : "1.04", + "x_module_name" : "Task::Weaken" + }, + "name" : "Task::Weaken", + "pathname" : "/authors/id/A/AD/ADAMK/Task-Weaken-1.04.tar.gz", + "provides" : { + "Task::Weaken" : { + "file" : "Task/Weaken.pm", + "version" : "1.04" + } + }, + "version" : "1.04" + }, + "Template" : { + "dist" : "Template-Toolkit-2.22", + "module" : "Template", + "mymeta" : { + "abstract" : "comprehensive template processing system", + "author" : [ + "Andy Wardley <abw@wardley.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Template-Toolkit", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "AppConfig" : "1.56", + "File::Spec" : "0.8", + "File::Temp" : "0.12", + "Scalar::Util" : 0 + } + } + }, + "release_status" : "stable", + "version" : "2.22" + }, + "name" : "Template", + "pathname" : "/authors/id/A/AB/ABW/Template-Toolkit-2.22.tar.gz", + "provides" : { + "Template" : { + "file" : "Template.pm", + "version" : "2.22" + }, + "Template::Base" : { + "file" : "Template/Base.pm", + "version" : "2.78" + }, + "Template::Config" : { + "file" : "Template/Config.pm", + "version" : "2.75" + }, + "Template::Constants" : { + "file" : "Template/Constants.pm", + "version" : "2.75" + }, + "Template::Context" : { + "file" : "Template/Context.pm", + "version" : "2.98" + }, + "Template::Directive" : { + "file" : "Template/Directive.pm", + "version" : "2.2" + }, + "Template::Document" : { + "file" : "Template/Document.pm", + "version" : "2.79" + }, + "Template::Exception" : { + "file" : "Template/Exception.pm", + "version" : "2.7" + }, + "Template::Filters" : { + "file" : "Template/Filters.pm", + "version" : "2.87" + }, + "Template::Grammar" : { + "file" : "Template/Grammar.pm", + "version" : "2.25" + }, + "Template::Iterator" : { + "file" : "Template/Iterator.pm", + "version" : "2.68" + }, + "Template::Monad::Assert" : { + "file" : "Template/Plugin/Assert.pm" + }, + "Template::Monad::Scalar" : { + "file" : "Template/Plugin/Scalar.pm" + }, + "Template::Namespace::Constants" : { + "file" : "Template/Namespace/Constants.pm", + "version" : "1.27" + }, + "Template::Parser" : { + "file" : "Template/Parser.pm", + "version" : "2.89" + }, + "Template::Perl" : { + "file" : "Template/Filters.pm" + }, + "Template::Plugin" : { + "file" : "Template/Plugin.pm", + "version" : "2.7" + }, + "Template::Plugin::Assert" : { + "file" : "Template/Plugin/Assert.pm", + "version" : "1" + }, + "Template::Plugin::CGI" : { + "file" : "Template/Plugin/CGI.pm", + "version" : "2.7" + }, + "Template::Plugin::Datafile" : { + "file" : "Template/Plugin/Datafile.pm", + "version" : "2.72" + }, + "Template::Plugin::Date" : { + "file" : "Template/Plugin/Date.pm", + "version" : "2.78" + }, + "Template::Plugin::Date::Calc" : { + "file" : "Template/Plugin/Date.pm" + }, + "Template::Plugin::Date::Manip" : { + "file" : "Template/Plugin/Date.pm" + }, + "Template::Plugin::Directory" : { + "file" : "Template/Plugin/Directory.pm", + "version" : "2.7" + }, + "Template::Plugin::Dumper" : { + "file" : "Template/Plugin/Dumper.pm", + "version" : "2.7" + }, + "Template::Plugin::File" : { + "file" : "Template/Plugin/File.pm", + "version" : "2.71" + }, + "Template::Plugin::Filter" : { + "file" : "Template/Plugin/Filter.pm", + "version" : "1.38" + }, + "Template::Plugin::Format" : { + "file" : "Template/Plugin/Format.pm", + "version" : "2.7" + }, + "Template::Plugin::HTML" : { + "file" : "Template/Plugin/HTML.pm", + "version" : "2.62" + }, + "Template::Plugin::Image" : { + "file" : "Template/Plugin/Image.pm", + "version" : "1.21" + }, + "Template::Plugin::Iterator" : { + "file" : "Template/Plugin/Iterator.pm", + "version" : "2.68" + }, + "Template::Plugin::Math" : { + "file" : "Template/Plugin/Math.pm", + "version" : "1.16" + }, + "Template::Plugin::Pod" : { + "file" : "Template/Plugin/Pod.pm", + "version" : "2.69" + }, + "Template::Plugin::Procedural" : { + "file" : "Template/Plugin/Procedural.pm", + "version" : "1.17" + }, + "Template::Plugin::Scalar" : { + "file" : "Template/Plugin/Scalar.pm", + "version" : "1" + }, + "Template::Plugin::String" : { + "file" : "Template/Plugin/String.pm", + "version" : "2.4" + }, + "Template::Plugin::Table" : { + "file" : "Template/Plugin/Table.pm", + "version" : "2.71" + }, + "Template::Plugin::URL" : { + "file" : "Template/Plugin/URL.pm", + "version" : "2.74" + }, + "Template::Plugin::View" : { + "file" : "Template/Plugin/View.pm", + "version" : "2.68" + }, + "Template::Plugin::Wrap" : { + "file" : "Template/Plugin/Wrap.pm", + "version" : "2.68" + }, + "Template::Plugins" : { + "file" : "Template/Plugins.pm", + "version" : "2.77" + }, + "Template::Provider" : { + "file" : "Template/Provider.pm", + "version" : "2.94" + }, + "Template::Service" : { + "file" : "Template/Service.pm", + "version" : "2.8" + }, + "Template::Stash" : { + "file" : "Template/Stash.pm", + "version" : "2.91" + }, + "Template::Stash::Context" : { + "file" : "Template/Stash/Context.pm", + "version" : "1.63" + }, + "Template::Stash::XS" : { + "file" : "Template/Stash/XS.pm" + }, + "Template::Test" : { + "file" : "Template/Test.pm", + "version" : "2.75" + }, + "Template::TieString" : { + "file" : "Template/Config.pm" + }, + "Template::VMethods" : { + "file" : "Template/VMethods.pm", + "version" : "2.16" + }, + "Template::View" : { + "file" : "Template/View.pm", + "version" : "2.91" + }, + "bytes" : { + "file" : "Template/Provider.pm" + } + }, + "version" : "2.22" + }, + "Template::Plugin::Comma" : { + "dist" : "Template-Plugin-Comma-0.04", + "module" : "Template::Plugin::Comma", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Template-Plugin-Comma", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Template" : "2.07", + "Test::More" : "0.32" + } + } + }, + "release_status" : "stable", + "version" : "0.04" + }, + "name" : "Template::Plugin::Comma", + "pathname" : "M/MI/MIYAGAWA/Template-Plugin-Comma-0.04.tar.gz", + "provides" : { + "Template::Plugin::Comma" : { + "file" : "Template/Plugin/Comma.pm", + "version" : "0.04" + } + }, + "version" : "0.04" + }, + "Template::Timer" : { + "dist" : "Template-Timer-1.00", + "module" : "Template::Timer", + "mymeta" : { + "abstract" : "Rudimentary profiling for Template Toolkit", + "author" : [ + "Andy Lester <andy@petdance.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.44, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Template-Timer", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Template" : 0, + "Test::More" : 0, + "Time::HiRes" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "x_Repository" : "http://github.com/petdance/template-timer/" + }, + "version" : "1.00" + }, + "name" : "Template::Timer", + "pathname" : "P/PE/PETDANCE/Template-Timer-1.00.tar.gz", + "provides" : { + "Template::Timer" : { + "file" : "Template/Timer.pm", + "version" : "1.00" + } + }, + "version" : "1.00" + }, + "Test::Base" : { + "dist" : "Test-Base-0.60", + "module" : "Test::Base", + "mymeta" : { + "abstract" : "A Data Driven Testing Framework", + "author" : [ + "Ingy döt Net <ingy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Base", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "recommends" : { + "Test::Deep" : 0 + }, + "requires" : { + "Filter::Util::Call" : 0, + "Spiffy" : "0.30", + "Test::More" : "0.62", + "perl" : "5.006001" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.60" + }, + "name" : "Test::Base", + "pathname" : "I/IN/INGY/Test-Base-0.60.tar.gz", + "provides" : { + "Module::Install::TestBase" : { + "file" : "Module/Install/TestBase.pm", + "version" : "0.60" + }, + "Test::Base" : { + "file" : "Test/Base.pm", + "version" : "0.60" + }, + "Test::Base::Block" : { + "file" : "Test/Base.pm" + }, + "Test::Base::Filter" : { + "file" : "Test/Base/Filter.pm" + }, + "Test::Base::Handle" : { + "file" : "Test/Base.pm" + } + }, + "version" : "0.60" + }, + "Test::Deep" : { + "dist" : "Test-Deep-0.108", + "module" : "Test::Deep", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "Fergal Daly <fergal@esatclear.ie>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Deep", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "List::Util" : "1.09", + "Scalar::Util" : "1.09", + "Test::More" : 0, + "Test::NoWarnings" : "0.02", + "Test::Tester" : "0.04" + } + } + }, + "release_status" : "stable", + "version" : "0.108" + }, + "name" : "Test::Deep", + "pathname" : "R/RJ/RJBS/Test-Deep-0.108.tar.gz", + "provides" : { + "Test::Deep" : { + "file" : "Test/Deep.pm", + "version" : "0.108" + }, + "Test::Deep::All" : { + "file" : "Test/Deep/All.pm" + }, + "Test::Deep::Any" : { + "file" : "Test/Deep/Any.pm" + }, + "Test::Deep::Array" : { + "file" : "Test/Deep/Array.pm" + }, + "Test::Deep::ArrayEach" : { + "file" : "Test/Deep/ArrayEach.pm" + }, + "Test::Deep::ArrayElementsOnly" : { + "file" : "Test/Deep/ArrayElementsOnly.pm" + }, + "Test::Deep::ArrayLength" : { + "file" : "Test/Deep/ArrayLength.pm" + }, + "Test::Deep::ArrayLengthOnly" : { + "file" : "Test/Deep/ArrayLengthOnly.pm" + }, + "Test::Deep::Blessed" : { + "file" : "Test/Deep/Blessed.pm" + }, + "Test::Deep::Boolean" : { + "file" : "Test/Deep/Boolean.pm" + }, + "Test::Deep::Cache" : { + "file" : "Test/Deep/Cache.pm" + }, + "Test::Deep::Cache::Simple" : { + "file" : "Test/Deep/Cache/Simple.pm" + }, + "Test::Deep::Class" : { + "file" : "Test/Deep/Class.pm" + }, + "Test::Deep::Cmp" : { + "file" : "Test/Deep/Cmp.pm" + }, + "Test::Deep::Code" : { + "file" : "Test/Deep/Code.pm" + }, + "Test::Deep::Hash" : { + "file" : "Test/Deep/Hash.pm" + }, + "Test::Deep::HashEach" : { + "file" : "Test/Deep/HashEach.pm" + }, + "Test::Deep::HashElements" : { + "file" : "Test/Deep/HashElements.pm" + }, + "Test::Deep::HashKeys" : { + "file" : "Test/Deep/HashKeys.pm" + }, + "Test::Deep::HashKeysOnly" : { + "file" : "Test/Deep/HashKeysOnly.pm" + }, + "Test::Deep::Ignore" : { + "file" : "Test/Deep/Ignore.pm" + }, + "Test::Deep::Isa" : { + "file" : "Test/Deep/Isa.pm" + }, + "Test::Deep::ListMethods" : { + "file" : "Test/Deep/ListMethods.pm" + }, + "Test::Deep::MM" : { + "file" : "Test/Deep/MM.pm" + }, + "Test::Deep::Methods" : { + "file" : "Test/Deep/Methods.pm" + }, + "Test::Deep::NoTest" : { + "file" : "Test/Deep/NoTest.pm" + }, + "Test::Deep::Number" : { + "file" : "Test/Deep/Number.pm" + }, + "Test::Deep::Ref" : { + "file" : "Test/Deep/Ref.pm" + }, + "Test::Deep::RefType" : { + "file" : "Test/Deep/RefType.pm" + }, + "Test::Deep::Regexp" : { + "file" : "Test/Deep/Regexp.pm" + }, + "Test::Deep::RegexpMatches" : { + "file" : "Test/Deep/RegexpMatches.pm" + }, + "Test::Deep::RegexpRef" : { + "file" : "Test/Deep/RegexpRef.pm" + }, + "Test::Deep::RegexpRefOnly" : { + "file" : "Test/Deep/RegexpRefOnly.pm" + }, + "Test::Deep::RegexpVersion" : { + "file" : "Test/Deep/RegexpVersion.pm" + }, + "Test::Deep::ScalarRef" : { + "file" : "Test/Deep/ScalarRef.pm" + }, + "Test::Deep::ScalarRefOnly" : { + "file" : "Test/Deep/ScalarRefOnly.pm" + }, + "Test::Deep::Set" : { + "file" : "Test/Deep/Set.pm" + }, + "Test::Deep::Shallow" : { + "file" : "Test/Deep/Shallow.pm" + }, + "Test::Deep::Stack" : { + "file" : "Test/Deep/Stack.pm" + }, + "Test::Deep::String" : { + "file" : "Test/Deep/String.pm" + }, + "Test::Deep::SubHash" : { + "file" : "Test/Deep/Hash.pm" + }, + "Test::Deep::SubHashElements" : { + "file" : "Test/Deep/HashElements.pm" + }, + "Test::Deep::SubHashKeys" : { + "file" : "Test/Deep/HashKeys.pm" + }, + "Test::Deep::SubHashKeysOnly" : { + "file" : "Test/Deep/HashKeysOnly.pm" + }, + "Test::Deep::SuperHash" : { + "file" : "Test/Deep/Hash.pm" + }, + "Test::Deep::SuperHashElements" : { + "file" : "Test/Deep/HashElements.pm" + }, + "Test::Deep::SuperHashKeys" : { + "file" : "Test/Deep/HashKeys.pm" + }, + "Test::Deep::SuperHashKeysOnly" : { + "file" : "Test/Deep/HashKeysOnly.pm" + } + }, + "version" : "0.108" + }, + "Test::Exception" : { + "dist" : "Test-Exception-0.31", + "module" : "Test::Exception", + "mymeta" : { + "abstract" : "Test exception based code", + "author" : [ + "Adrian Howard <adrianh@quietstars.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Exception", + "prereqs" : { + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "Sub::Uplevel" : "0.18", + "Test::Builder" : "0.7", + "Test::Builder::Tester" : "1.07", + "Test::Harness" : "2.03", + "Test::More" : "0.7", + "Test::Simple" : "0.7" + } + } + }, + "provides" : { + "Test::Exception" : { + "file" : "lib/Test/Exception.pm", + "version" : "0.31" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.31" + }, + "name" : "Test::Exception", + "pathname" : "/authors/id/A/AD/ADIE/Test-Exception-0.31.tar.gz", + "provides" : { + "Test::Exception" : { + "file" : "Test/Exception.pm", + "version" : "0.31" + } + }, + "version" : "0.31" + }, + "Test::Fatal" : { + "dist" : "Test-Fatal-0.008", + "module" : "Test::Fatal", + "mymeta" : { + "abstract" : "incredibly simple helpers for testing code with exceptions", + "author" : [ + "Ricardo Signes <rjbs@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.300003, CPAN::Meta::Converter version 2.112621, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Fatal", + "prereqs" : { + "build" : { + "requires" : { + "Test::Builder::Tester" : 0, + "Test::More" : "0.47", + "overload" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.30" + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Exporter" : "5.57", + "Test::Builder" : 0, + "Try::Tiny" : "0.07", + "strict" : 0, + "warnings" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "https://github.com/rjbs/test-fatal", + "repository" : { + "url" : "https://github.com/rjbs/test-fatal.git" + } + }, + "version" : "0.008", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", + "name" : "@RJBS/CheckPrereqsIndexed", + "version" : "0.005" + }, + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@RJBS/@Basic/GatherDir", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@RJBS/@Basic/PruneCruft", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@RJBS/@Basic/ManifestSkip", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@RJBS/@Basic/MetaYAML", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@RJBS/@Basic/License", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@RJBS/@Basic/Readme", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@RJBS/@Basic/ExtraTests", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@RJBS/@Basic/ExecDir", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@RJBS/@Basic/ShareDir", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@RJBS/@Basic/MakeMaker", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@RJBS/@Basic/Manifest", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@RJBS/@Basic/TestRelease", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@RJBS/@Basic/ConfirmRelease", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@RJBS/@Basic/UploadToCPAN", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@RJBS/AutoPrereqs", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::Git::NextVersion", + "name" : "@RJBS/Git::NextVersion", + "version" : "1.112510" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@RJBS/PkgVersion", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@RJBS/MetaConfig", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@RJBS/MetaJSON", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@RJBS/NextRelease", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@RJBS/PodSyntaxTests", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::Repository", + "name" : "@RJBS/Repository", + "version" : "0.18" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@RJBS/TestMoreWithSubtests", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@RJBS/PodWeaver", + "version" : "3.101641" + }, + { + "class" : "Dist::Zilla::Plugin::GithubMeta", + "name" : "@RJBS/GithubMeta", + "version" : "0.26" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "name" : "@RJBS/@Git/Check", + "version" : "1.112510" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "name" : "@RJBS/@Git/Commit", + "version" : "1.112510" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "name" : "@RJBS/@Git/Tag", + "version" : "1.112510" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "name" : "@RJBS/@Git/Push", + "version" : "1.112510" + }, + { + "class" : "Dist::Zilla::Plugin::RemovePrereqs", + "config" : { + "Dist::Zilla::Plugin::RemovePrereqs" : { + "modules_to_remove" : [ + "Test::More" + ] + } + }, + "name" : "RemovePrereqs", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "TestRequires", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.300003" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "4.300003" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : "0" + }, + "version" : "4.300003" + } + } + }, + "name" : "Test::Fatal", + "pathname" : "R/RJ/RJBS/Test-Fatal-0.008.tar.gz", + "provides" : { + "Test::Fatal" : { + "file" : "Test/Fatal.pm", + "version" : "0.008" + } + }, + "version" : "0.008" + }, + "Test::LongString" : { + "dist" : "Test-LongString-0.15", + "module" : "Test::LongString", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "Rafael Garcia-Suarez <rgs@consttype.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.55_02, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-LongString", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Builder" : "0.12", + "Test::Builder::Tester" : "1.04" + } + } + }, + "release_status" : "stable", + "version" : "0.15" + }, + "name" : "Test::LongString", + "pathname" : "R/RG/RGARCIA/Test-LongString-0.15.tar.gz", + "provides" : { + "Test::LongString" : { + "file" : "Test/LongString.pm", + "version" : "0.15" + } + }, + "version" : "0.15" + }, + "Test::Manifest" : { + "dist" : "Test-Manifest-1.23", + "module" : "Test::Manifest", + "mymeta" : { + "abstract" : "interact with a t/test_manifest file", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Manifest", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.03", + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.23" + }, + "name" : "Test::Manifest", + "pathname" : "B/BD/BDFOY/Test-Manifest-1.23.tar.gz", + "provides" : { + "Test::Manifest" : { + "file" : "Test/Manifest.pm", + "version" : "1.23" + } + }, + "version" : "1.23" + }, + "Test::NoWarnings" : { + "dist" : "Test-NoWarnings-1.04", + "module" : "Test::NoWarnings", + "mymeta" : { + "abstract" : "Make sure you didn't emit any warnings while testing", + "author" : [ + "Fergal Daly <fergal@esatclear.ie>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112621, CPAN::Meta::Converter version 2.112150", + "license" : [ + "open_source" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-NoWarnings", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.47", + "Test::Tester" : "0.107" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Builder" : "0.86", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/Test-NoWarnings" + } + }, + "version" : "1.04" + }, + "name" : "Test::NoWarnings", + "pathname" : "A/AD/ADAMK/Test-NoWarnings-1.04.tar.gz", + "provides" : { + "Test::NoWarnings" : { + "file" : "Test/NoWarnings.pm", + "version" : "1.04" + }, + "Test::NoWarnings::Warning" : { + "file" : "Test/NoWarnings/Warning.pm", + "version" : "1.04" + } + }, + "version" : "1.04" + }, + "Test::Object" : { + "dist" : "Test-Object-0.07", + "module" : "Test::Object", + "mymeta" : { + "abstract" : "Thoroughly testing objects via registered handlers", + "author" : [ + "Adam Kennedy <cpan@ali.as>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.64, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Object", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Exporter" : 0, + "File::Spec" : "0.80", + "Scalar::Util" : "1.16", + "Test::Builder" : "0.33", + "Test::Builder::Tester" : "1.02", + "Test::More" : "0.42", + "overload" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.07" + }, + "name" : "Test::Object", + "pathname" : "/authors/id/A/AD/ADAMK/Test-Object-0.07.tar.gz", + "provides" : { + "Test::Object" : { + "file" : "Test/Object.pm", + "version" : "0.07" + }, + "Test::Object::Test" : { + "file" : "Test/Object/Test.pm", + "version" : "0.07" + } + }, + "version" : "0.07" + }, + "Test::Output" : { + "dist" : "Test-Output-0.16", + "module" : "Test::Output", + "mymeta" : { + "abstract" : "Utilities to test STDOUT and STDERR messages.", + "author" : [ + "brian d foy <bdfoy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Output", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "File::Temp" : "0.21", + "Sub::Exporter" : 0, + "Test::More" : 0, + "Test::Tester" : "0.107" + } + } + }, + "release_status" : "stable", + "version" : "0.16" + }, + "name" : "Test::Output", + "pathname" : "/authors/id/B/BD/BDFOY/Test-Output-0.16.tar.gz", + "provides" : { + "Test::Output" : { + "file" : "Test/Output.pm", + "version" : "0.16" + }, + "Test::Output::Tie" : { + "file" : "Test/Output/Tie.pm", + "version" : "0.14" + } + }, + "version" : "0.16" + }, + "Test::Pod" : { + "dist" : "Test-Pod-1.45", + "module" : "Test::Pod", + "mymeta" : { + "abstract" : "check for POD errors in files", + "author" : [ + "Currently maintained by David E. Wheeler, C<< <david@justatheory.com> >>." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Pod", + "prereqs" : { + "build" : { + "requires" : { + "File::Spec" : 0, + "Pod::Simple" : "3.05", + "Test::More" : "0.62" + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.30" + } + }, + "runtime" : { + "requires" : { + "File::Spec" : 0, + "Pod::Simple" : "3.05", + "Test::Builder::Tester" : "1.02", + "Test::More" : "0.62" + } + } + }, + "provides" : { + "Test::Pod" : { + "file" : "lib/Test/Pod.pm", + "version" : "1.45" + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://github.com/theory/test-pod/issues/" + }, + "homepage" : "http://search.cpan.org/dist/Test-Pod/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/theory/test-pod/tree/" + } + }, + "version" : "1.45" + }, + "name" : "Test::Pod", + "pathname" : "D/DW/DWHEELER/Test-Pod-1.45.tar.gz", + "provides" : { + "Test::Pod" : { + "file" : "Test/Pod.pm", + "version" : "1.45" + } + }, + "version" : "1.45" + }, + "Test::Requires" : { + "dist" : "Test-Requires-0.06", + "module" : "Test::Requires", + "mymeta" : { + "abstract" : "Checks to see if the module can be loaded", + "author" : [ + "Tokuhiro Matsuno <tokuhirom @*(#RJKLFHFSDLJF gmail.com>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Requires", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.61", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.06" + }, + "name" : "Test::Requires", + "pathname" : "T/TO/TOKUHIROM/Test-Requires-0.06.tar.gz", + "provides" : { + "Test::Requires" : { + "file" : "Test/Requires.pm", + "version" : "0.06" + } + }, + "version" : "0.06" + }, + "Test::Simple" : { + "dist" : "Test-Simple-0.98", + "module" : "Test::More", + "mymeta" : { + "abstract" : "Basic utilities for writing tests.", + "author" : [ + "Michael G Schwern <schwern@pobox.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_06, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Simple", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Harness" : "2.03", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://github.com/schwern/test-more/issues" + }, + "homepage" : "http://test-more.googlecode.com", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/schwern/test-more/tree/master" + }, + "x_MailingList" : "http://groups.google.com/group/test-more-users" + }, + "version" : "0.98" + }, + "name" : "Test::Simple", + "pathname" : "M/MS/MSCHWERN/Test-Simple-0.98.tar.gz", + "provides" : { + "Test::Builder" : { + "file" : "Test/Builder.pm", + "version" : "0.98" + }, + "Test::Builder::IO::Scalar" : { + "file" : "Test/Builder/IO/Scalar.pm", + "version" : "2.110" + }, + "Test::Builder::Module" : { + "file" : "Test/Builder/Module.pm", + "version" : "0.98" + }, + "Test::Builder::Tester" : { + "file" : "Test/Builder/Tester.pm", + "version" : "1.22" + }, + "Test::Builder::Tester::Color" : { + "file" : "Test/Builder/Tester/Color.pm", + "version" : "1.22" + }, + "Test::Builder::Tester::Tie" : { + "file" : "Test/Builder/Tester.pm" + }, + "Test::More" : { + "file" : "Test/More.pm", + "version" : "0.98" + }, + "Test::Simple" : { + "file" : "Test/Simple.pm", + "version" : "0.98" + } + }, + "version" : "0.98" + }, + "Test::SubCalls" : { + "dist" : "Test-SubCalls-1.09", + "module" : "Test::SubCalls", + "mymeta" : { + "abstract" : "Track the number of times subs are called", + "author" : [ + "Adam Kennedy <adamk@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.85, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-SubCalls", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "File::Spec" : "0.80", + "Hook::LexWrap" : "0.20", + "Test::Builder::Tester" : "1.02", + "Test::More" : "0.42" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.ali.as/cpan/trunk/Test-SubCalls" + }, + "x_ChangeLog" : "http://fisheye2.atlassian.com/changelog/cpan/trunk/Test-SubCalls" + }, + "version" : "1.09", + "x_module_name" : "Test::SubCalls" + }, + "name" : "Test::SubCalls", + "pathname" : "/authors/id/A/AD/ADAMK/Test-SubCalls-1.09.tar.gz", + "provides" : { + "Test::SubCalls" : { + "file" : "Test/SubCalls.pm", + "version" : "1.09" + } + }, + "version" : "1.09" + }, + "Test::Tester" : { + "dist" : "Test-Tester-0.108", + "module" : "Test::Tester", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.30_01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Tester", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Builder" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.108", + "x_installdirs" : "perl", + "x_version_from" : "./lib/Test/Tester.pm" + }, + "name" : "Test::Tester", + "pathname" : "F/FD/FDALY/Test-Tester-0.108.tar.gz", + "provides" : { + "Test::Tester" : { + "file" : "Test/Tester.pm", + "version" : "0.108" + }, + "Test::Tester::Capture" : { + "file" : "Test/Tester/Capture.pm" + }, + "Test::Tester::CaptureRunner" : { + "file" : "Test/Tester/CaptureRunner.pm" + }, + "Test::Tester::Delegate" : { + "file" : "Test/Tester/Delegate.pm" + } + }, + "version" : "0.108" + }, + "Test::WWW::Mechanize" : { + "dist" : "Test-WWW-Mechanize-1.38", + "module" : "Test::WWW::Mechanize", + "mymeta" : { + "abstract" : "Testing-specific WWW::Mechanize subclass", + "author" : [ + "Andy Lester <andy@petdance.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112621, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-WWW-Mechanize", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp::Assert::More" : 0, + "HTML::TreeBuilder" : 0, + "HTTP::Server::Simple" : "0.42", + "HTTP::Server::Simple::CGI" : 0, + "LWP" : "6.02", + "Test::Builder::Tester" : "1.09", + "Test::LongString" : "0.15", + "Test::More" : 0, + "URI::file" : 0, + "WWW::Mechanize" : "1.68", + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://code.google.com/p/www-mechanize/issues/list" + }, + "homepage" : "https://github.com/petdance/test-www-mechanize", + "license" : [ + "http://www.opensource.org/licenses/artistic-license-2.0" + ], + "repository" : { + "url" : "https://github.com/petdance/test-www-mechanize" + } + }, + "version" : "1.38" + }, + "name" : "Test::WWW::Mechanize", + "pathname" : "P/PE/PETDANCE/Test-WWW-Mechanize-1.38.tar.gz", + "provides" : { + "Test::WWW::Mechanize" : { + "file" : "Test/WWW/Mechanize.pm", + "version" : "1.38" + } + }, + "version" : "1.38" + }, + "Test::WWW::Mechanize::Catalyst" : { + "dist" : "Test-WWW-Mechanize-Catalyst-0.53", + "module" : "Test::WWW::Mechanize::Catalyst", + "mymeta" : { + "abstract" : "Test::WWW::Mechanize for Catalyst", + "author" : [ + "Ash Berlin C<< <ash@cpan.org> >> (current maintiner)" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.99, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-WWW-Mechanize-Catalyst", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Catalyst::Plugin::Session::State::Cookie" : 0, + "Catalyst::Plugin::Session::Store::Dummy" : 0, + "ExtUtils::MakeMaker" : "6.42", + "Test::Exception" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Catalyst" : "5.00", + "LWP" : "5.816", + "Moose" : "0.67", + "Test::WWW::Mechanize" : "1.14", + "WWW::Mechanize" : "1.54", + "namespace::clean" : "0.09" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://dev.catalyst.perl.org/repos/Catalyst/Test-WWW-Mechanize-Catalyst/trunk/" + } + }, + "version" : "0.53" + }, + "name" : "Test::WWW::Mechanize::Catalyst", + "pathname" : "/authors/id/B/BO/BOBTFISH/Test-WWW-Mechanize-Catalyst-0.53.tar.gz", + "provides" : { + "Test::WWW::Mechanize::Catalyst" : { + "file" : "Test/WWW/Mechanize/Catalyst.pm", + "version" : "0.53" + } + }, + "version" : "0.53" + }, + "Test::Warn" : { + "dist" : "Test-Warn-0.23", + "module" : "Test::Warn", + "mymeta" : { + "abstract" : "Perl extension to test methods for warnings", + "author" : [ + "Alexandr Ciornii <alexchorny@gmail.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "keywords" : [ + "testing", + "warnings" + ], + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-Warn", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "File::Spec" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Sub::Uplevel" : "0.12", + "Test::Builder" : "0.13", + "Test::Builder::Tester" : "1.02", + "Tree::DAG_Node" : "1.02", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/chorny/test-warn/tree" + } + }, + "version" : "0.23" + }, + "name" : "Test::Warn", + "pathname" : "/authors/id/C/CH/CHORNY/Test-Warn-0.23.tar.gz", + "provides" : { + "Test::Warn" : { + "file" : "Test/Warn.pm", + "version" : "0.23" + }, + "Test::Warn::Categorization" : { + "file" : "Test/Warn.pm" + }, + "Test::Warn::DAG_Node_Tree" : { + "file" : "Test/Warn.pm" + } + }, + "version" : "0.23" + }, + "Test::use::ok" : { + "dist" : "Test-use-ok-0.02", + "module" : "ok", + "mymeta" : { + "abstract" : "Alternative to Test::More::use_ok", + "author" : [ + ", 2006 by Audrey Tang <cpan@audreyt.org>." + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 0.64, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Test-use-ok", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.02" + }, + "name" : "Test::use::ok", + "pathname" : "/authors/id/A/AU/AUDREYT/Test-use-ok-0.02.tar.gz", + "provides" : { + "Test::use::ok" : { + "file" : "Test/use/ok.pm", + "version" : "0.02" + }, + "ok" : { + "file" : "ok.pm", + "version" : "0.02" + } + }, + "version" : "0.02" + }, + "Text::Glob" : { + "dist" : "Text-Glob-0.09", + "module" : "Text::Glob", + "mymeta" : { + "abstract" : "match globbing patterns against text", + "author" : [ + "Richard Clamp <richardc@unixbeard.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Text-Glob", + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + } + }, + "provides" : { + "Text::Glob" : { + "file" : "lib/Text/Glob.pm", + "version" : "0.09" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "0.09" + }, + "name" : "Text::Glob", + "pathname" : "R/RC/RCLAMP/Text-Glob-0.09.tar.gz", + "provides" : { + "Text::Glob" : { + "file" : "Text/Glob.pm", + "version" : "0.09" + } + }, + "version" : "0.09" + }, + "Text::SimpleTable" : { + "dist" : "Text-SimpleTable-2.03", + "module" : "Text::SimpleTable", + "mymeta" : { + "abstract" : "Simple eyecandy ASCII tables", + "author" : [ + "Sebastian Riedel <sri@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.54, CPAN::Meta::Converter version 2.112150", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Text-SimpleTable", + "no_index" : { + "directory" : [ + "t", + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : {} + }, + "runtime" : { + "requires" : { + "ExtUtils::MakeMaker" : 0, + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://github.com/kraih/text-simpletable/tree/master" + } + }, + "version" : "2.03" + }, + "name" : "Text::SimpleTable", + "pathname" : "M/MR/MRAMBERG/Text-SimpleTable-2.03.tar.gz", + "provides" : { + "Text::SimpleTable" : { + "file" : "Text/SimpleTable.pm", + "version" : "2.03" + } + }, + "version" : "2.03" + }, + "Text::Template" : { + "dist" : "Text-Template-1.45", + "module" : "Text::Template", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.30_01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Text-Template", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "version" : "1.45", + "x_installdirs" : "site", + "x_version_from" : "lib/Text/Template.pm" + }, + "name" : "Text::Template", + "pathname" : "M/MJ/MJD/Text-Template-1.45.tar.gz", + "provides" : { + "Text::Template" : { + "file" : "Text/Template.pm", + "version" : "1.45" + }, + "Text::Template::Preprocess" : { + "file" : "Text/Template/Preprocess.pm", + "version" : "1.45" + } + }, + "version" : "1.45" + }, + "Tie::IxHash" : { + "dist" : "Tie-IxHash-1.22", + "module" : "Tie::IxHash", + "mymeta" : { + "abstract" : "ordered associative arrays for Perl", + "author" : [ + "Gurusamy Sarathy gsar@umich.edu" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Tie-IxHash", + "prereqs" : { + "runtime" : { + "requires" : { + "perl" : "5.003" + } + } + }, + "provides" : { + "Tie::IxHash" : { + "file" : "lib/Tie/IxHash.pm", + "version" : "1.22" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/chorny/Tie-IxHash.git" + } + }, + "version" : "1.22" + }, + "name" : "Tie::IxHash", + "pathname" : "/authors/id/C/CH/CHORNY/Tie-IxHash-1.22.tar.gz", + "provides" : { + "Tie::IxHash" : { + "file" : "Tie/IxHash.pm", + "version" : "1.22" + } + }, + "version" : "1.22" + }, + "Tie::ToObject" : { + "dist" : "Tie-ToObject-0.03", + "module" : "Tie::ToObject", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.42, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Tie-ToObject", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Scalar::Util" : 0, + "Test::More" : 0, + "Test::use::ok" : 0, + "Tie::RefHash" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.03" + }, + "name" : "Tie::ToObject", + "pathname" : "N/NU/NUFFIN/Tie-ToObject-0.03.tar.gz", + "provides" : { + "Tie::ToObject" : { + "file" : "Tie/ToObject.pm", + "version" : "0.03" + } + }, + "version" : "0.03" + }, + "TimeDate" : { + "dist" : "TimeDate-1.20", + "module" : "Date::Format", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "Graham Barr <gbarr@pobox.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.48, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "TimeDate", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : {} + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gbarr/perl-TimeDate" + } + }, + "version" : "1.20" + }, + "name" : "TimeDate", + "pathname" : "G/GB/GBARR/TimeDate-1.20.tar.gz", + "provides" : { + "Date::Format" : { + "file" : "Date/Format.pm", + "version" : "2.24" + }, + "Date::Format::Generic" : { + "file" : "Date/Format.pm" + }, + "Date::Language" : { + "file" : "Date/Language.pm", + "version" : "1.10" + }, + "Date::Language::Afar" : { + "file" : "Date/Language/Afar.pm", + "version" : "0.99" + }, + "Date::Language::Amharic" : { + "file" : "Date/Language/Amharic.pm", + "version" : "1.00" + }, + "Date::Language::Austrian" : { + "file" : "Date/Language/Austrian.pm", + "version" : "1.01" + }, + "Date::Language::Brazilian" : { + "file" : "Date/Language/Brazilian.pm", + "version" : "1.01" + }, + "Date::Language::Chinese" : { + "file" : "Date/Language/Chinese.pm", + "version" : "1.00" + }, + "Date::Language::Chinese_GB" : { + "file" : "Date/Language/Chinese_GB.pm", + "version" : "1.01" + }, + "Date::Language::Czech" : { + "file" : "Date/Language/Czech.pm", + "version" : "1.01" + }, + "Date::Language::Danish" : { + "file" : "Date/Language/Danish.pm", + "version" : "1.01" + }, + "Date::Language::Dutch" : { + "file" : "Date/Language/Dutch.pm", + "version" : "1.02" + }, + "Date::Language::English" : { + "file" : "Date/Language/English.pm", + "version" : "1.01" + }, + "Date::Language::Finnish" : { + "file" : "Date/Language/Finnish.pm", + "version" : "1.01" + }, + "Date::Language::French" : { + "file" : "Date/Language/French.pm", + "version" : "1.04" + }, + "Date::Language::Gedeo" : { + "file" : "Date/Language/Gedeo.pm", + "version" : "0.99" + }, + "Date::Language::German" : { + "file" : "Date/Language/German.pm", + "version" : "1.02" + }, + "Date::Language::Greek" : { + "file" : "Date/Language/Greek.pm", + "version" : "1.00" + }, + "Date::Language::Hungarian" : { + "file" : "Date/Language/Hungarian.pm", + "version" : "1.01" + }, + "Date::Language::Icelandic" : { + "file" : "Date/Language/Icelandic.pm", + "version" : "1.01" + }, + "Date::Language::Italian" : { + "file" : "Date/Language/Italian.pm", + "version" : "1.01" + }, + "Date::Language::Norwegian" : { + "file" : "Date/Language/Norwegian.pm", + "version" : "1.01" + }, + "Date::Language::Oromo" : { + "file" : "Date/Language/Oromo.pm", + "version" : "0.99" + }, + "Date::Language::Romanian" : { + "file" : "Date/Language/Romanian.pm", + "version" : "1.01" + }, + "Date::Language::Russian" : { + "file" : "Date/Language/Russian.pm", + "version" : "1.01" + }, + "Date::Language::Russian_cp1251" : { + "file" : "Date/Language/Russian_cp1251.pm", + "version" : "1.01" + }, + "Date::Language::Russian_koi8r" : { + "file" : "Date/Language/Russian_koi8r.pm", + "version" : "1.01" + }, + "Date::Language::Sidama" : { + "file" : "Date/Language/Sidama.pm", + "version" : "0.99" + }, + "Date::Language::Somali" : { + "file" : "Date/Language/Somali.pm", + "version" : "0.99" + }, + "Date::Language::Spanish" : { + "file" : "Date/Language/Spanish.pm", + "version" : "1.00" + }, + "Date::Language::Swedish" : { + "file" : "Date/Language/Swedish.pm", + "version" : "1.01" + }, + "Date::Language::Tigrinya" : { + "file" : "Date/Language/Tigrinya.pm", + "version" : "1.00" + }, + "Date::Language::TigrinyaEritrean" : { + "file" : "Date/Language/TigrinyaEritrean.pm", + "version" : "1.00" + }, + "Date::Language::TigrinyaEthiopian" : { + "file" : "Date/Language/TigrinyaEthiopian.pm", + "version" : "1.00" + }, + "Date::Language::Turkish" : { + "file" : "Date/Language/Turkish.pm", + "version" : "1.0" + }, + "Date::Parse" : { + "file" : "Date/Parse.pm", + "version" : "2.30" + }, + "Time::Zone" : { + "file" : "Time/Zone.pm", + "version" : "2.24" + } + }, + "version" : "2.24" + }, + "Tree::DAG_Node" : { + "dist" : "Tree-DAG_Node-1.06", + "module" : "Tree::DAG_Node", + "mymeta" : { + "abstract" : "(super)class for representing nodes in a tree", + "author" : [ + "David Hand, <cogent@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.36, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Tree-DAG_Node", + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "strict" : 0, + "vars" : 0 + } + } + }, + "release_status" : "stable", + "version" : "1.06" + }, + "name" : "Tree::DAG_Node", + "pathname" : "/authors/id/C/CO/COGENT/Tree-DAG_Node-1.06.tar.gz", + "provides" : { + "Tree::DAG_Node" : { + "file" : "Tree/DAG_Node.pm", + "version" : "1.06" + } + }, + "version" : "1.06" + }, + "Tree::Simple" : { + "dist" : "Tree-Simple-1.18", + "module" : "Tree::Simple", + "mymeta" : { + "abstract" : "A simple tree object", + "author" : [ + "Stevan Little, E<lt>stevan@iinteractive.comE<gt>", + "Rob Kinyon, E<lt>rob@iinteractive.comE<gt>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Tree-Simple", + "prereqs" : { + "build" : { + "requires" : { + "Test::Exception" : "0.15", + "Test::More" : "0.47" + } + }, + "runtime" : { + "requires" : { + "Scalar::Util" : "1.18", + "perl" : "v5.6.0" + } + } + }, + "provides" : { + "Tree::Simple" : { + "file" : "lib/Tree/Simple.pm", + "version" : "1.18" + }, + "Tree::Simple::Visitor" : { + "file" : "lib/Tree/Simple/Visitor.pm", + "version" : "1.11" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ] + }, + "version" : "1.18" + }, + "name" : "Tree::Simple", + "pathname" : "S/ST/STEVAN/Tree-Simple-1.18.tar.gz", + "provides" : { + "Tree::Simple" : { + "file" : "Tree/Simple.pm", + "version" : "1.18" + }, + "Tree::Simple::Visitor" : { + "file" : "Tree/Simple/Visitor.pm", + "version" : "1.11" + } + }, + "version" : "1.18" + }, + "Tree::Simple::VisitorFactory" : { + "dist" : "Tree-Simple-VisitorFactory-0.10", + "module" : "Tree::Simple::Visitor::FindByPath", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Tree-Simple-VisitorFactory", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "File::Spec" : "0.6", + "Scalar::Util" : "1.1", + "Test::Exception" : "0.15", + "Test::More" : "0.47", + "Tree::Simple" : "1.12" + } + } + }, + "release_status" : "stable", + "version" : "0.10" + }, + "name" : "Tree::Simple::VisitorFactory", + "pathname" : "S/ST/STEVAN/Tree-Simple-VisitorFactory-0.10.tar.gz", + "provides" : { + "Tree::Simple::Visitor::BreadthFirstTraversal" : { + "file" : "Tree/Simple/Visitor/BreadthFirstTraversal.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::CreateDirectoryTree" : { + "file" : "Tree/Simple/Visitor/CreateDirectoryTree.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::FindByNodeValue" : { + "file" : "Tree/Simple/Visitor/FindByNodeValue.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::FindByPath" : { + "file" : "Tree/Simple/Visitor/FindByPath.pm", + "version" : "0.03" + }, + "Tree::Simple::Visitor::FindByUID" : { + "file" : "Tree/Simple/Visitor/FindByUID.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::FromNestedArray" : { + "file" : "Tree/Simple/Visitor/FromNestedArray.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::FromNestedHash" : { + "file" : "Tree/Simple/Visitor/FromNestedHash.pm", + "version" : "0.03" + }, + "Tree::Simple::Visitor::GetAllDescendents" : { + "file" : "Tree/Simple/Visitor/GetAllDescendents.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::LoadClassHierarchy" : { + "file" : "Tree/Simple/Visitor/LoadClassHierarchy.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::LoadDirectoryTree" : { + "file" : "Tree/Simple/Visitor/LoadDirectoryTree.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::PathToRoot" : { + "file" : "Tree/Simple/Visitor/PathToRoot.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::PostOrderTraversal" : { + "file" : "Tree/Simple/Visitor/PostOrderTraversal.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::PreOrderTraversal" : { + "file" : "Tree/Simple/Visitor/PreOrderTraversal.pm", + "version" : "0.01" + }, + "Tree::Simple::Visitor::Sort" : { + "file" : "Tree/Simple/Visitor/Sort.pm", + "version" : "0.03" + }, + "Tree::Simple::Visitor::ToNestedArray" : { + "file" : "Tree/Simple/Visitor/ToNestedArray.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::ToNestedHash" : { + "file" : "Tree/Simple/Visitor/ToNestedHash.pm", + "version" : "0.02" + }, + "Tree::Simple::Visitor::VariableDepthClone" : { + "file" : "Tree/Simple/Visitor/VariableDepthClone.pm", + "version" : "0.03" + }, + "Tree::Simple::VisitorFactory" : { + "file" : "Tree/Simple/VisitorFactory.pm", + "version" : "0.10" + } + }, + "version" : "0.03" + }, + "Try::Tiny" : { + "dist" : "Try-Tiny-0.11", + "module" : "Try::Tiny", + "mymeta" : { + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Try-Tiny", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.11" + }, + "name" : "Try::Tiny", + "pathname" : "D/DO/DOY/Try-Tiny-0.11.tar.gz", + "provides" : { + "Try::Tiny" : { + "file" : "Try/Tiny.pm", + "version" : "0.11" + } + }, + "version" : "0.11" + }, + "UNIVERSAL::require" : { + "dist" : "UNIVERSAL-require-0.13", + "module" : "UNIVERSAL::require", + "mymeta" : { + "abstract" : "require() modules from a variable", + "author" : [ + "Michael G Schwern <schwern@pobox.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.50, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "UNIVERSAL-require", + "no_index" : { + "directory" : [ + "t", + "inc" + ], + "package" : [ + "UNIVERSAL" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=UNIVERSAL-require" + }, + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://svn.schwern.org/repos/CPAN/UNIVERSAL-require/trunk/" + } + }, + "version" : "0.13" + }, + "name" : "UNIVERSAL::require", + "pathname" : "M/MS/MSCHWERN/UNIVERSAL-require-0.13.tar.gz", + "provides" : { + "UNIVERSAL" : { + "file" : "UNIVERSAL/require.pm" + }, + "UNIVERSAL::require" : { + "file" : "UNIVERSAL/require.pm", + "version" : "0.13" + } + }, + "version" : "0.13" + }, + "URI" : { + "dist" : "URI-1.59", + "module" : "URI", + "mymeta" : { + "abstract" : "Uniform Resource Identifiers (absolute and relative)", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "URI", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0, + "Test" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "recommends" : { + "Business::ISBN" : 0 + }, + "requires" : { + "MIME::Base64" : "2", + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://gitorious.org/projects/perl-uri" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "1.59" + }, + "name" : "URI", + "pathname" : "G/GA/GAAS/URI-1.59.tar.gz", + "provides" : { + "URI" : { + "file" : "URI.pm", + "version" : "1.59" + }, + "URI::Escape" : { + "file" : "URI/Escape.pm", + "version" : "3.31" + }, + "URI::Heuristic" : { + "file" : "URI/Heuristic.pm", + "version" : "4.20" + }, + "URI::IRI" : { + "file" : "URI/IRI.pm" + }, + "URI::QueryParam" : { + "file" : "URI/QueryParam.pm" + }, + "URI::Split" : { + "file" : "URI/Split.pm" + }, + "URI::URL" : { + "file" : "URI/URL.pm", + "version" : "5.04" + }, + "URI::WithBase" : { + "file" : "URI/WithBase.pm", + "version" : "2.20" + }, + "URI::data" : { + "file" : "URI/data.pm" + }, + "URI::file" : { + "file" : "URI/file.pm", + "version" : "4.21" + }, + "URI::file::Base" : { + "file" : "URI/file/Base.pm" + }, + "URI::file::FAT" : { + "file" : "URI/file/FAT.pm" + }, + "URI::file::Mac" : { + "file" : "URI/file/Mac.pm" + }, + "URI::file::OS2" : { + "file" : "URI/file/OS2.pm" + }, + "URI::file::QNX" : { + "file" : "URI/file/QNX.pm" + }, + "URI::file::Unix" : { + "file" : "URI/file/Unix.pm" + }, + "URI::file::Win32" : { + "file" : "URI/file/Win32.pm" + }, + "URI::ftp" : { + "file" : "URI/ftp.pm" + }, + "URI::gopher" : { + "file" : "URI/gopher.pm" + }, + "URI::http" : { + "file" : "URI/http.pm" + }, + "URI::https" : { + "file" : "URI/https.pm" + }, + "URI::ldap" : { + "file" : "URI/ldap.pm", + "version" : "1.12" + }, + "URI::ldapi" : { + "file" : "URI/ldapi.pm" + }, + "URI::ldaps" : { + "file" : "URI/ldaps.pm" + }, + "URI::mailto" : { + "file" : "URI/mailto.pm" + }, + "URI::mms" : { + "file" : "URI/mms.pm" + }, + "URI::news" : { + "file" : "URI/news.pm" + }, + "URI::nntp" : { + "file" : "URI/nntp.pm" + }, + "URI::pop" : { + "file" : "URI/pop.pm" + }, + "URI::rlogin" : { + "file" : "URI/rlogin.pm" + }, + "URI::rsync" : { + "file" : "URI/rsync.pm" + }, + "URI::rtsp" : { + "file" : "URI/rtsp.pm" + }, + "URI::rtspu" : { + "file" : "URI/rtspu.pm" + }, + "URI::sip" : { + "file" : "URI/sip.pm", + "version" : "0.11" + }, + "URI::sips" : { + "file" : "URI/sips.pm" + }, + "URI::snews" : { + "file" : "URI/snews.pm" + }, + "URI::ssh" : { + "file" : "URI/ssh.pm" + }, + "URI::telnet" : { + "file" : "URI/telnet.pm" + }, + "URI::tn3270" : { + "file" : "URI/tn3270.pm" + }, + "URI::urn" : { + "file" : "URI/urn.pm" + }, + "URI::urn::isbn" : { + "file" : "URI/urn/isbn.pm" + }, + "URI::urn::oid" : { + "file" : "URI/urn/oid.pm" + } + }, + "version" : "1.59" + }, + "URI::SmartURI" : { + "dist" : "URI-SmartURI-0.031", + "module" : "URI::SmartURI", + "mymeta" : { + "abstract" : "Subclassable and hostless URIs", + "author" : [ + "Rafael Kitover, C<< <rkitover at cpan.org> >>", + "Rafael Kitover <rkitover@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "URI-SmartURI", + "no_index" : { + "directory" : [ + "inc", + "t" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42", + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "Class::C3::Componentised" : 0, + "File::Find::Rule" : 0, + "List::MoreUtils" : 0, + "List::Util" : 0, + "Moose" : 0, + "Scalar::Util" : 0, + "Test::More" : 0, + "URI" : "1.51", + "namespace::clean" : 0, + "perl" : "5.008001" + } + } + }, + "provides" : { + "URI::SmartURI" : { + "file" : "lib/URI/SmartURI.pm", + "version" : "0.031" + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/rkitover/uri-smarturi.git" + } + }, + "version" : "0.031" + }, + "name" : "URI::SmartURI", + "pathname" : "R/RK/RKITOVER/URI-SmartURI-0.031.tar.gz", + "provides" : { + "URI::SmartURI" : { + "file" : "URI/SmartURI.pm", + "version" : "0.031" + } + }, + "version" : "0.031" + }, + "Variable::Magic" : { + "dist" : "Variable-Magic-0.47", + "module" : "Variable::Magic", + "mymeta" : { + "abstract" : "Associate user-defined magic to variables from Perl.", + "author" : [ + "Vincent Pit <perl@profvince.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112621, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Variable-Magic", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "Config" : 0, + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "Exporter" : 0, + "XSLoader" : 0, + "base" : 0, + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Variable-Magic" + }, + "homepage" : "http://search.cpan.org/dist/Variable-Magic/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "http://git.profvince.com/?p=perl%2Fmodules%2FVariable-Magic.git" + } + }, + "version" : "0.47" + }, + "name" : "Variable::Magic", + "pathname" : "V/VP/VPIT/Variable-Magic-0.47.tar.gz", + "provides" : { + "Variable::Magic" : { + "file" : "Variable/Magic.pm", + "version" : "0.47" + } + }, + "version" : "0.47" + }, + "WWW::Mechanize" : { + "dist" : "WWW-Mechanize-1.71", + "module" : "WWW::Mechanize", + "mymeta" : { + "abstract" : "Handy web browsing in a Perl object", + "author" : [ + "Jesse Vincent <jesse@bestpractical.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "WWW-Mechanize", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Carp" : 0, + "File::Temp" : 0, + "FindBin" : 0, + "Getopt::Long" : 0, + "HTML::Form" : "1.038", + "HTML::HeadParser" : 0, + "HTML::Parser" : "3.33", + "HTML::TokeParser" : "2.28", + "HTML::TreeBuilder" : 0, + "HTTP::Daemon" : 0, + "HTTP::Request" : "1.3", + "HTTP::Server::Simple" : "0.35", + "HTTP::Server::Simple::CGI" : 0, + "HTTP::Status" : 0, + "LWP" : "5.829", + "LWP::UserAgent" : "5.829", + "Pod::Usage" : 0, + "Test::More" : "0.34", + "Test::Warn" : "0.11", + "URI" : "1.36", + "URI::URL" : 0, + "URI::file" : 0, + "perl" : "5.008" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://code.google.com/p/www-mechanize/issues/list" + }, + "homepage" : "https://github.com/bestpractical/www-mechanize", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "x_MailingList" : "http://groups.google.com/group/www-mechanize-users", + "x_Repository" : "https://github.com/bestpractical/www-mechanize" + }, + "version" : "1.71" + }, + "name" : "WWW::Mechanize", + "pathname" : "J/JE/JESSE/WWW-Mechanize-1.71.tar.gz", + "provides" : { + "WWW::Mechanize" : { + "file" : "WWW/Mechanize.pm", + "version" : "1.71" + }, + "WWW::Mechanize::Image" : { + "file" : "WWW/Mechanize/Image.pm" + }, + "WWW::Mechanize::Link" : { + "file" : "WWW/Mechanize/Link.pm" + } + }, + "version" : "1.71" + }, + "WWW::RobotRules" : { + "dist" : "WWW-RobotRules-6.01", + "module" : "WWW::RobotRules", + "mymeta" : { + "abstract" : "database of robots.txt-derived permissions", + "author" : [ + "Gisle Aas <gisle@activestate.com>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "WWW-RobotRules", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "AnyDBM_File" : 0, + "Fcntl" : 0, + "URI" : "1.10", + "perl" : "5.008008" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/gisle/libwww-perl/tree/WWW-RobotRules/master" + }, + "x_MailingList" : "mailto:libwww@perl.org" + }, + "version" : "6.01" + }, + "name" : "WWW::RobotRules", + "pathname" : "G/GA/GAAS/WWW-RobotRules-6.01.tar.gz", + "provides" : { + "WWW::RobotRules" : { + "file" : "WWW/RobotRules.pm", + "version" : "6.01" + }, + "WWW::RobotRules::AnyDBM_File" : { + "file" : "WWW/RobotRules/AnyDBM_File.pm", + "version" : "6.00" + }, + "WWW::RobotRules::InCore" : { + "file" : "WWW/RobotRules.pm" + } + }, + "version" : "6.01" + }, + "Web::Scraper" : { + "dist" : "Web-Scraper-0.36", + "module" : "Web::Scraper", + "mymeta" : { + "abstract" : "Web Scraping Toolkit using HTML and CSS Selectors or XPath expressions", + "author" : [ + "Tatsuhiko Miyagawa <miyagawa@bulknews.net>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.04, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "Web-Scraper", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.62", + "Test::Base" : 0, + "Test::More" : 0, + "Test::Requires" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.62" + } + }, + "runtime" : { + "requires" : { + "HTML::Entities" : 0, + "HTML::Selector::XPath" : "0.03", + "HTML::Tagset" : 0, + "HTML::TreeBuilder" : "3.23", + "HTML::TreeBuilder::XPath" : "0.08", + "LWP" : "5.827", + "Scalar::Util" : 0, + "UNIVERSAL::require" : 0, + "URI" : 0, + "XML::XPathEngine" : "0.08", + "YAML" : 0, + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/miyagawa/web-scraper.git" + } + }, + "version" : "0.36" + }, + "name" : "Web::Scraper", + "pathname" : "M/MI/MIYAGAWA/Web-Scraper-0.36.tar.gz", + "provides" : { + "Web::Scraper" : { + "file" : "Web/Scraper.pm", + "version" : "0.36" + }, + "Web::Scraper::Filter" : { + "file" : "Web/Scraper/Filter.pm" + }, + "Web::Scraper::LibXML" : { + "file" : "Web/Scraper/LibXML.pm" + } + }, + "version" : "0.36" + }, + "XML::Parser" : { + "dist" : "XML-Parser-2.41", + "module" : "XML::Parser", + "mymeta" : { + "abstract" : "A perl module for parsing XML documents", + "author" : [ + "Clark Cooper (coopercc@netheaven.com)" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "XML-Parser", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "LWP" : 0, + "perl" : "5.00405" + } + } + }, + "release_status" : "stable", + "resources" : { + "repository" : { + "url" : "http://github.com/chorny/XML-Parser" + } + }, + "version" : "2.41" + }, + "name" : "XML::Parser", + "pathname" : "T/TO/TODDR/XML-Parser-2.41.tar.gz", + "provides" : { + "XML::Parser" : { + "file" : "XML/Parser.pm", + "version" : "2.41" + }, + "XML::Parser::Expat" : { + "file" : "XML/Parser/Expat.pm", + "version" : "2.41" + }, + "XML::Parser::Style::Debug" : { + "file" : "XML/Parser/Style/Debug.pm" + }, + "XML::Parser::Style::Objects" : { + "file" : "XML/Parser/Style/Objects.pm" + }, + "XML::Parser::Style::Stream" : { + "file" : "XML/Parser/Style/Stream.pm" + }, + "XML::Parser::Style::Subs" : { + "file" : "XML/Parser/Style/Subs.pm" + }, + "XML::Parser::Style::Tree" : { + "file" : "XML/Parser/Style/Tree.pm" + } + }, + "version" : "2.41" + }, + "XML::RSS" : { + "dist" : "XML-RSS-1.49", + "module" : "XML::RSS", + "mymeta" : { + "abstract" : "creates and updates RSS files", + "author" : [ + "Shlomi Fish <shlomif@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "keywords" : [ + "feed", + "feeds", + "generate", + "generating", + "parse", + "parsing", + "rss", + "RSS", + "web-feed", + "web-feeds", + "xml" + ], + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "XML-RSS", + "prereqs" : { + "build" : { + "requires" : { + "Test::Manifest" : "0.9", + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "Module::Build" : "0.36" + } + }, + "runtime" : { + "requires" : { + "DateTime" : 0, + "DateTime::Format::Mail" : 0, + "DateTime::Format::W3CDTF" : 0, + "HTML::Entities" : 0, + "XML::Parser" : "2.23", + "perl" : "5.008" + } + } + }, + "provides" : { + "XML::RSS" : { + "file" : "lib/XML/RSS.pm", + "version" : "1.49" + }, + "XML::RSS::Private::Output::Base" : { + "file" : "lib/XML/RSS/Private/Output/Base.pm", + "version" : 0 + }, + "XML::RSS::Private::Output::Roles::ImageDims" : { + "file" : "lib/XML/RSS/Private/Output/Roles/ImageDims.pm", + "version" : 0 + }, + "XML::RSS::Private::Output::Roles::ModulesElems" : { + "file" : "lib/XML/RSS/Private/Output/Roles/ModulesElems.pm", + "version" : 0 + }, + "XML::RSS::Private::Output::V0_9" : { + "file" : "lib/XML/RSS/Private/Output/V0_9.pm", + "version" : 0 + }, + "XML::RSS::Private::Output::V0_91" : { + "file" : "lib/XML/RSS/Private/Output/V0_91.pm", + "version" : 0 + }, + "XML::RSS::Private::Output::V1_0" : { + "file" : "lib/XML/RSS/Private/Output/V1_0.pm", + "version" : 0 + }, + "XML::RSS::Private::Output::V2_0" : { + "file" : "lib/XML/RSS/Private/Output/V2_0.pm", + "version" : 0 + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "http://perl-rss.sourceforge.net/", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "url" : "https://svn.perl.org/modules/XML-RSS/trunk" + } + }, + "version" : "1.49" + }, + "name" : "XML::RSS", + "pathname" : "S/SH/SHLOMIF/XML-RSS-1.49.tar.gz", + "provides" : { + "XML::RSS" : { + "file" : "XML/RSS.pm", + "version" : "1.49" + }, + "XML::RSS::Private::Output::Base" : { + "file" : "XML/RSS/Private/Output/Base.pm" + }, + "XML::RSS::Private::Output::Roles::ImageDims" : { + "file" : "XML/RSS/Private/Output/Roles/ImageDims.pm" + }, + "XML::RSS::Private::Output::Roles::ModulesElems" : { + "file" : "XML/RSS/Private/Output/Roles/ModulesElems.pm" + }, + "XML::RSS::Private::Output::V0_9" : { + "file" : "XML/RSS/Private/Output/V0_9.pm" + }, + "XML::RSS::Private::Output::V0_91" : { + "file" : "XML/RSS/Private/Output/V0_91.pm" + }, + "XML::RSS::Private::Output::V1_0" : { + "file" : "XML/RSS/Private/Output/V1_0.pm" + }, + "XML::RSS::Private::Output::V2_0" : { + "file" : "XML/RSS/Private/Output/V2_0.pm" + } + }, + "version" : "1.49" + }, + "XML::Simple" : { + "dist" : "XML-Simple-2.18", + "module" : "XML::Simple", + "mymeta" : { + "abstract" : "Easy API to maintain XML (esp config files)", + "author" : [ + "Grant McLean <grantm@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "XML-Simple", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::Simple" : "0.41", + "XML::Parser" : 0 + } + } + }, + "release_status" : "stable", + "version" : "2.18" + }, + "name" : "XML::Simple", + "pathname" : "G/GR/GRANTM/XML-Simple-2.18.tar.gz", + "provides" : { + "XML::Simple" : { + "file" : "XML/Simple.pm", + "version" : "2.18" + } + }, + "version" : "2.18" + }, + "XML::XPathEngine" : { + "dist" : "XML-XPathEngine-0.13", + "module" : "XML::XPathEngine", + "mymeta" : { + "abstract" : "a re-usable XPath engine for DOM-like trees", + "author" : [ + "Michel Rodriguez <mirod@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.59, CPAN::Meta::Converter version 2.112150", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "XML-XPathEngine", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "release_status" : "stable", + "version" : "0.13" + }, + "name" : "XML::XPathEngine", + "pathname" : "M/MI/MIROD/XML-XPathEngine-0.13.tar.gz", + "provides" : { + "XML::XPathEngine" : { + "file" : "XML/XPathEngine.pm", + "version" : "0.13" + }, + "XML::XPathEngine::Boolean" : { + "file" : "XML/XPathEngine/Boolean.pm" + }, + "XML::XPathEngine::Expr" : { + "file" : "XML/XPathEngine/Expr.pm" + }, + "XML::XPathEngine::Function" : { + "file" : "XML/XPathEngine/Function.pm" + }, + "XML::XPathEngine::Literal" : { + "file" : "XML/XPathEngine/Literal.pm" + }, + "XML::XPathEngine::LocationPath" : { + "file" : "XML/XPathEngine/LocationPath.pm" + }, + "XML::XPathEngine::NodeSet" : { + "file" : "XML/XPathEngine/NodeSet.pm" + }, + "XML::XPathEngine::Number" : { + "file" : "XML/XPathEngine/Number.pm" + }, + "XML::XPathEngine::Root" : { + "file" : "XML/XPathEngine/Root.pm" + }, + "XML::XPathEngine::Step" : { + "file" : "XML/XPathEngine/Step.pm" + }, + "XML::XPathEngine::Variable" : { + "file" : "XML/XPathEngine/Variable.pm" + } + }, + "version" : "0.13" + }, + "YAML" : { + "dist" : "YAML-0.77", + "module" : "YAML", + "mymeta" : { + "abstract" : "YAML Ain't Markup Language (tm)", + "author" : [ + "Ingy döt Net <ingy@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.01, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "YAML", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "homepage" : "http://github.com/ingydotnet/yaml-pm/tree", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://github.com/ingydotnet/yaml-pm.git" + } + }, + "version" : "0.77", + "x_module_name" : "YAML" + }, + "name" : "YAML", + "pathname" : "I/IN/INGY/YAML-0.77.tar.gz", + "provides" : { + "Test::YAML" : { + "file" : "Test/YAML.pm", + "version" : "0.77" + }, + "Test::YAML::Filter" : { + "file" : "Test/YAML.pm" + }, + "YAML" : { + "file" : "YAML.pm", + "version" : "0.77" + }, + "YAML::Any" : { + "file" : "YAML/Any.pm", + "version" : "0.77" + }, + "YAML::Dumper" : { + "file" : "YAML/Dumper.pm", + "version" : "0.77" + }, + "YAML::Dumper::Base" : { + "file" : "YAML/Dumper/Base.pm", + "version" : "0.77" + }, + "YAML::Error" : { + "file" : "YAML/Error.pm", + "version" : "0.77" + }, + "YAML::Loader" : { + "file" : "YAML/Loader.pm", + "version" : "0.77" + }, + "YAML::Loader::Base" : { + "file" : "YAML/Loader/Base.pm", + "version" : "0.77" + }, + "YAML::Marshall" : { + "file" : "YAML/Marshall.pm", + "version" : "0.77" + }, + "YAML::Mo" : { + "file" : "YAML/Mo.pm" + }, + "YAML::Node" : { + "file" : "YAML/Node.pm", + "version" : "0.77" + }, + "YAML::Tag" : { + "file" : "YAML/Tag.pm", + "version" : "0.77" + }, + "YAML::Type::blessed" : { + "file" : "YAML/Types.pm" + }, + "YAML::Type::code" : { + "file" : "YAML/Types.pm" + }, + "YAML::Type::glob" : { + "file" : "YAML/Types.pm" + }, + "YAML::Type::ref" : { + "file" : "YAML/Types.pm" + }, + "YAML::Type::regexp" : { + "file" : "YAML/Types.pm" + }, + "YAML::Type::undef" : { + "file" : "YAML/Types.pm" + }, + "YAML::Types" : { + "file" : "YAML/Types.pm", + "version" : "0.77" + }, + "YAML::Warning" : { + "file" : "YAML/Error.pm" + }, + "yaml_mapping" : { + "file" : "YAML/Node.pm" + }, + "yaml_scalar" : { + "file" : "YAML/Node.pm" + }, + "yaml_sequence" : { + "file" : "YAML/Node.pm" + } + }, + "version" : "0.77" + }, + "aliased" : { + "dist" : "aliased-0.30", + "module" : "aliased", + "mymeta" : { + "abstract" : "Use shorter versions of class names.", + "author" : [ + "Curtis \"Ovid\" Poe <ovid@cpan.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "aliased", + "prereqs" : { + "runtime" : { + "requires" : { + "Test::More" : 0 + } + } + }, + "provides" : { + "aliased" : { + "file" : "lib/aliased.pm", + "version" : "0.30" + } + }, + "release_status" : "stable", + "resources" : {}, + "version" : "0.30" + }, + "name" : "aliased", + "pathname" : "O/OV/OVID/aliased-0.30.tar.gz", + "provides" : { + "aliased" : { + "file" : "aliased.pm", + "version" : "0.30" + } + }, + "version" : "0.30" + }, + "local::lib" : { + "dist" : "local-lib-1.008004", + "module" : "local::lib", + "mymeta" : { + "abstract" : "create and use a local lib/ for perl modules with PERL5LIB", + "author" : [ + "Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/" + ], + "dynamic_config" : 0, + "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "local-lib", + "no_index" : { + "directory" : [ + "inc", + "t", + "xt" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.42" + } + }, + "runtime" : { + "requires" : { + "CPAN" : "1.82", + "ExtUtils::Install" : "1.43", + "ExtUtils::MakeMaker" : "6.31", + "Module::Build" : "0.36", + "perl" : "5.008001" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=local-lib" + }, + "homepage" : "http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/local-lib.git", + "license" : [ + "http://dev.perl.org/licenses/" + ], + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/p5sagit/local-lib.git" + } + }, + "version" : "1.008004" + }, + "name" : "local::lib", + "pathname" : "A/AP/APEIRON/local-lib-1.008004.tar.gz", + "provides" : { + "lib::core::only" : { + "file" : "lib/core/only.pm" + }, + "local::lib" : { + "file" : "local/lib.pm", + "version" : "1.008004" + } + }, + "version" : "1.008004" + }, + "namespace::autoclean" : { + "dist" : "namespace-autoclean-0.12", + "module" : "namespace::autoclean", + "mymeta" : { + "abstract" : "Keep imports out of your namespace", + "author" : [ + "Florian Ragwitz <rafl@debian.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 4.200001, CPAN::Meta::Converter version 2.101610, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "namespace-autoclean", + "prereqs" : { + "build" : { + "requires" : { + "Moose::Role" : 0, + "Sub::Name" : 0, + "Test::More" : 0 + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "6.31" + } + }, + "runtime" : { + "requires" : { + "B::Hooks::EndOfScope" : 0, + "Class::MOP" : "0.80", + "List::Util" : 0, + "namespace::clean" : "0.20" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=namespace_autoclean" + }, + "homepage" : "http://search.cpan.org/dist/namespace_autoclean", + "repository" : { + "type" : "git", + "url" : "git://github.com/rafl/namespace_autoclean.git" + } + }, + "version" : "0.12", + "x_Dist_Zilla" : { + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::GatherDir", + "name" : "@FLORA/@Basic/GatherDir", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::PruneCruft", + "name" : "@FLORA/@Basic/PruneCruft", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@FLORA/@Basic/ManifestSkip", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@FLORA/@Basic/MetaYAML", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@FLORA/@Basic/License", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Readme", + "name" : "@FLORA/@Basic/Readme", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@FLORA/@Basic/ExtraTests", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@FLORA/@Basic/ExecDir", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@FLORA/@Basic/ShareDir", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "name" : "@FLORA/@Basic/MakeMaker", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@FLORA/@Basic/Manifest", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@FLORA/@Basic/TestRelease", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@FLORA/@Basic/ConfirmRelease", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@FLORA/@Basic/UploadToCPAN", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@FLORA/MetaConfig", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@FLORA/MetaJSON", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::PkgVersion", + "name" : "@FLORA/PkgVersion", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@FLORA/PodSyntaxTests", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::NoTabsTests", + "name" : "@FLORA/NoTabsTests", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::PodCoverageTests", + "name" : "@FLORA/PodCoverageTests", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@FLORA/MetaResources", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@FLORA/Authority", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::EOLTests", + "name" : "@FLORA/EOLTests", + "version" : "0.02" + }, + { + "class" : "Dist::Zilla::Plugin::PodWeaver", + "name" : "@FLORA/PodWeaver", + "version" : "3.101640" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@FLORA/AutoPrereqs", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "4.200001" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "4.200001" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : 0 + }, + "version" : "4.200001" + } + }, + "x_authority" : "cpan:FLORA" + }, + "name" : "namespace::autoclean", + "pathname" : "/authors/id/B/BO/BOBTFISH/namespace-autoclean-0.12.tar.gz", + "provides" : { + "namespace::autoclean" : { + "file" : "namespace/autoclean.pm", + "version" : "0.12" + } + }, + "version" : "0.12" + }, + "namespace::clean" : { + "dist" : "namespace-clean-0.21", + "module" : "namespace::clean", + "mymeta" : { + "abstract" : "Keep imports and functions out of your namespace", + "author" : [ + "Robert 'phaylon' Sedlacek <rs@474.at>, Florian Ragwitz <rafl@debian.org>, Jesse Luehrs <doy@tozt.net>" + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.57_05, CPAN::Meta::Converter version 2.112150", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "namespace-clean", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "Test::More" : "0.88" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : 0 + } + }, + "runtime" : { + "requires" : { + "B::Hooks::EndOfScope" : "0.07", + "Package::Stash" : "0.23" + } + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=namespace-clean" + }, + "homepage" : "http://search.cpan.org/dist/namespace-clean", + "repository" : { + "type" : "git", + "url" : "git://git.shadowcat.co.uk/p5sagit/namespace-clean.git" + } + }, + "version" : "0.21" + }, + "name" : "namespace::clean", + "pathname" : "R/RI/RIBASUSHI/namespace-clean-0.21.tar.gz", + "provides" : { + "namespace::clean" : { + "file" : "namespace/clean.pm", + "version" : "0.21" + } + }, + "version" : "0.21" + } + }, + "version" : "0.9" +} diff --git a/conf/general.yml-example b/conf/general.yml-example index 1418b0810..06af11a55 100644 --- a/conf/general.yml-example +++ b/conf/general.yml-example @@ -52,7 +52,9 @@ IPHONE_URL: '' # Log file (used in test harness, and later in admin scripts) HTTPD_ERROR_LOG: '/var/log/apache/error.log' -ALLOWED_COBRANDS: 'cobrand_one|cobrand_two' +ALLOWED_COBRANDS: + - cobrand_one + - cobrand_two: 'hostname_substring2' # How many items are returned in the GeoRSS feeds by default RSS_LIMIT: '20' diff --git a/conf/packages b/conf/packages index 766e7747c..21ee0a862 100644 --- a/conf/packages +++ b/conf/packages @@ -16,7 +16,6 @@ libsoap-lite-perl libstatistics-distributions-perl liburi-perl libwww-perl -libwww-perl libxml-rss-perl memcached perl @@ -26,7 +25,6 @@ perlmagick libjson-perl libimage-size-perl libmath-bigint-gmp-perl -libtext-template-perl gettext libtest-exception-perl libipc-run3-perl diff --git a/notes/INSTALL b/notes/INSTALL deleted file mode 100644 index bb28e60fa..000000000 --- a/notes/INSTALL +++ /dev/null @@ -1,141 +0,0 @@ -Installing FixMyStreet -====================== - -mySociety applications have generally been run on Debian systems. Other Linux -distributions (and more) may well work but may also require some tweaking. - -Clone the repository (you've probably already done this): - git clone git://github.com/mysociety/fixmystreet.git -and be sure to run: - git submodule update --init -inside to fetch the shared commonlib submodule. - -conf/packages is a list of Debian packages that are needed, so install them if -you're on Debian/Ubuntu. You'll also probably need to install lots of CPAN -modules, see the section on that below. - -FixMyStreet expects a PostgreSQL database, so set one of them up - the schema -is available in db/schema.sql. You will also need to load in db/alert_types.sql -to populate the alert types table. - -Copy conf/general.yml-example to conf/general.yml and set it up appropriately: -* provide the relevant database connection details -* the BASE_URL to be where your test site will run - eg 'http://localhost' -* set UPLOAD_DIR and GEO_CACHE to your preferred values -* MAP_TYPE - OSM is probably the best one to try to start with, it's being - successfully used. - -Environment setup ------------------ - -There is a little script that is used to set up the correct environment needed -for FMS to run (perl library paths, cpan install locations, bin paths etc). It -should be eval-ed in a bash shell to set environment variables: - eval `./setenv.pl` - -Cron scripts can be run through the bin/cron-wrapper script in order to be run -within the right environment. - -CPAN module dependencies ------------------------- - -There are many CPAN dependencies that should be dealt with using -module-manage.pl which takes care of fetching specific versions of packages -from CPAN and building them. To install all the CPAN packages needed: - - eval `./setenv.pl` - module-manage.pl setup - -Look in the perl-external directory for details. Notably the following are important: - -urls.txt - url to the specific packages to fetch -modules.txt - list of all modules that need to be built -minicpan/ - local subset of cpan - used as source for all packages -local-lib - where the cpan modules get built to -lib - some initial modules needed for bootstrap -bin - scripts to make it all work - -Read the perl-external/bin/module-manage.pl code to see how it all works. It is -basically a wrapper around cpanm (which builds the packages) and dpan (which -helps maintain the fake cpan subset). - -If you need to add a module do it using: - - module-manage.pl add Module::To::Add - -and it will update all the relevant bits. - -If a module won't build (Test::WWW::Mechanize and HTTP::Server::Simple fail -tests for me but the failures are not pertinent) then the module-manage script -will bail out. Look in ~/.cpanm/build_log to see what went wrong. You can force -an install if the test failures are not important by running cpanm directly: - - cpanm \ - --mirror /absolute/path/to/perl-external/minicpan \ - --mirror-only \ - --force \ - Test::WWW::Mechanize - -Hopefully once it is all built we can automate the running of module-manage.pl -in order to make sure that the setup is current. - -Note: Others are starting to work on this and it might be a good idea to switch -to their output: -http://blogs.perl.org/users/sebastian_willert/2011/03/how-i-distribute-my-projects.html - -Notes ------ - -* no-update-server is a shell script used by NUUG for setting up - www.fiksgatami.no using the FixMyStreet codebase. - -Running the code -================ - -Development ------------ - -Start the catalyst dev server using: - - CATALYST_DEBUG=1 ./script/fixmystreet_app_server.pl -r - -CATALYST_DEBUG turns on the very verbose debug output which is helpful to see what the code is actually doing. The '-r' flag watches for files to change and then restarts the dev server. - -Production ----------- - -mySociety currently use Apache, our httpd.conf performs a few redirect checks -and then passes everything else to the Catalyst app using FastCGI. Other -options are available with Catalyst, including PSGI, mod_perl, and so on. - -What's where in the code? -========================= - -FixMyStreet::App is a fairly standard Catalyst app; there aren't any really big -surprises. - -Note that the FixMyStreet.pm file is used though to abstract some config -related things. The FixMyStreet->test_mode(1) which will do things like send -all emails to a memory queue for the test scripts. test_mode should only be -used in test scripts, and so is different from setting STAGING to true. - -Testing -======= - -There are several tests in the t directory - organized into subdirs. Note that -there is a module FixMyStreet::TestMech that abstracts some things like logging -in as a user and grabbing all the form error messages. This makes testing much -slicker and less fiddly. - -Run all the tests (within the correct environment) using: - - prove -lr t - -or a specific test in verbose mode using: - - prove -lv t/app/controller/report_new.t - -For all the lovely options do 'prove --help'. Note I've made no attempt to make -the tests be able to run in parallel, the database fiddling would not be worth -it. The tests currently assume MAPIT_URL is set to the UK version. - diff --git a/notes/INSTALL.pod b/notes/INSTALL.pod new file mode 100644 index 000000000..b795a0043 --- /dev/null +++ b/notes/INSTALL.pod @@ -0,0 +1,284 @@ +=head1 Installing FixMyStreet + +=head1 DOWNLOADING + +Fetch the latest version from L<http://github.com/mysociety/fixmystreet> + +At the moment the best way is to clone it using git: + + git clone https://github.com/mysociety/fixmystreet.git + +You'll then need to install mySociety's common library of code by running the +following command from inside the fixmystreet directory: + + git submodule update --init + +=head1 REQUIREMENTS + +On the server you are installing FixMyStreet on you will need the following things: + +=head2 Software requirements + +=over + +=item * + +PostgreSQL. + +=item * + +Perl 5.8 or above + +=item * + +ImageMagick and the perl bindings. + +=item * + +A webserver that supports FastCGI + +=item * + +gettext + +=item * + +The CSS for FixMyStreet is generated from SCSS sources so you will need a SCSS +to CSS convertor. You can get one from L<http://sass-lang.com/> + +=back + +If you're expecting a lot of traffic it's recommended that you install memcached: L<http://memcached.org/> + +If you're using a Debian based Linux distribution then the packages to install +some required dependencies (though not all the required Perl modules) are +listed in C<conf/packages>. To install all of them you can run: + + xargs -a conf/packages apt-get install + +Note, you will need to either be logged in as root or to use + + sudo xargs -a conf/packages apt-get install + +for this to work. + +=head2 Service dependencies + +For most uses of FixMyStreet you'll also need access to a MaPit server with +data for the types of bodies you are reporting issues to. For more details on +how to install MaPit see the mapit pypi page: L<http://pypi.python.org/pypi/django-mapit/> + +If you are in the UK then you can always use the mySociety's MaPit: L<http://mapit.mysociety.org> +although please check with us if you are expecting to generate a lot of +requests. + +You will also need a Tile Server to serve up Map tiles. FixMyStreet can use +Google, Bing and OpenStreetMap Tile servers. + +Finally, you will need a geolocation service to turn addresses into longitude +and latitudes. FixMyStreet currently includes code to use both Bing and Google +geolocation services. + +=head1 DETAILED INSTALLATION INSTRUCTIONS + +=head2 Unpacking the Code + +Once you've downloaded the code you should unpack it. The best place to do this +is in the location you want the web server vhost to be. + +=head2 Creating the database + +The default settings file assumes the database is called fms and the user the same. +You can change these if you like. + +=head2 Set up the database + +Once you've created the database you can use the sql in C<db/schema.sql> to create the required +tables, triggers and stored procedures. You will also need to run +C<db/alert_types.sql> which +populates the alert_types table. + +=head2 Install Perl modules + +FixMyStreet uses a number of CPAN modules which are installed by the +C<bin/install_perl_modules> script, so run that now. This will install them +into a directory called local. + +It uses cpanminus and Carton under the hood but should install these +of they are missing. You may need to install some source packages to +allow some of the included modules to be built, including: + +=over + +=item * + +expat + +=item * + +Postgresql + +=item * + +The GMP math library + +=back + +You will also need development tools installed. If you have installed the +above source packages from distribution packages this should also install +the required development tools. + +=head2 Set up Webserver + +It is recommended that you run FixMyStreet using FastCGI. It should also be +possible to run it using Plack/PSGI. + +There is an example Apache vhost configuration file in C<conf/httpd.conf-example> +which contains a sample configuration and the required redirect rules. + +If you are using Apache and the sample configuration you will need the following +modules enabled: + +=over + +=item * + +mod_rewrite + +=item * + +mod_proxy + +=item * + +mod_expires + +=item * + +mod_fastcgi + +=back + +For most Linux distributuions you should be able to install these using the distribution's +packaging system. + +=head1 SETTINGS + +The settings for FixMyStreet are defined in C<conf/general.yml> using the YAML +markup language. There are some defaults in C<conf/general.yml-example> which +you should copy to C<conf/general.yml>. + +The bare minimum of settings you will need to fill in or update are: + +=over + +=item FMS_DB_PASS + +This is the password for the database. + +=item BASE_URL + +The URL for the homepage of your FixMyStreet install. + +=item EMAIL_DOMAIN + +The email domain that emails will be sent from + +=item CONTACT_EMAIL + +The email address to be used on the site for the contact us form. + +=item STAGING_SITE + +If this is 1 then all email ( alerts and reports ) will be sent to the +contact email address. Use this for development sites. + +=item UPLOAD_DIR + +This is the location where images will be stored when they are uploaded. +It should be accessible by and writeable by the FixMyStreet process. + +=item GEO_CACHE + +This is the location where Geolocation data will be cached. +It should be accessible by and writeable by the FixMyStreet process. + +=back + +If you are using Bing or Google maps you should also set one of +BING_MAPS_API_KEY or GOOGLE_MAPS_API_KEY. + +If you are using a MaPit install you should update MAPIT_URL. + +=head2 Generate CSS + +There is a script, bin/make_css, that uses sass (L<http://sass-lang.com/>) to +convert the SCSS files to CSS files. + +=head2 Restart the webserver + +At this point you be able to restart the webserver and see your FixMyStreet +installation at the configured URL. + +=head2 Cron jobs + +There is an example crontab in C<conf/crontab.ugly>. At the moment this is in +the format used by mySociety's internal deployment tools. To convert this to +a valid crontab the following should be done: + +=over + +=item * + +Replace C<!!(*= $user *)!!> with the name of the user the cron should run under + +=item * + +Replace C<!!(* $vhost *)!!> with the path to the FixMyStreet code. + +=back + +=head2 Check it's working + +You can run the unit tests using C<prove -r t> in the FixMyStreet directory. Note +that this may leave entries in your database at the moment and should not be run +on a live site. + +=head2 Next Steps + +The admin site should be protected using HTTP AUTH. + +Customise your install using Templates, CSS and a Cobrand module. See C<notes/customisation.pod> +for details. + +Add contact details for authorities and categories using the admin interface. + +Add authority data to the MaPit install if required. + +=head1 COMMON PROBLEMS + +=head2 locale + +By default FixMyStreet uses the en_GB.UTF-8 locale. If it is not installed then +it may not start + +=head2 Template caching + +FixMyStreet caches compiled templates alongside the source files so the templates +directory needs to be writable by the process that is running FixMyStreet. + +=head2 Image::Magick perl module + +If your OS has a way to install a binary version of Image::Magick then it's recommended +that you do that rather than install via CPAN. + +=head2 Missing Perl modules + +We think we've included all the modules you should need to run and develop FixMyStreet on your +machine but it we've missed one (please let us know if this is the case), or you want to add one +for something you are developing then you can do so using: + + ./bin/cron-wrapper ./local/bin/carton install Module::To::Add + +which will install the module into the local directory. C<./bin/cron-wrapper> is a script to +make sure the correct library paths are set up for running scripts. diff --git a/notes/customisation.pod b/notes/customisation.pod new file mode 100644 index 000000000..04bfb6e1d --- /dev/null +++ b/notes/customisation.pod @@ -0,0 +1,205 @@ +=head1 Customising FixMyStreet + +This document explains how to tailor the default installation of +FixMyStreet to your requirements, including limiting the geographic +area it accepts queries for and translating the text. + +It also includes information about how to change the design. + +=head1 OVERVIEW + +FixMyStreet implements a Cobrand system in order to allow customisation +of the default behavior. The Cobrand is made up of a set of templates for +the Cobrand and a Cobrand module that contains code that customises the +way the Cobrand behaves. There are defaults for both of these so the +Cobrand only needs to override things that are specific to it. + +Customisations should be implemented like this as this means that any +upgrade to FixMyStreet will not overwrite your changes. + +For a cobrand to work then it should have the same name as your site, +e.g if your site is www.FixMyPark.com then your Cobrand should be +called FixMyPark. + +The default Cobrand is called Default. + +=head1 TEMPLATES + +Templates are found in the templates directory. Within that there are +seperate directories for web templates and email templates. Under each +of these there is a directory for each Cobrand. In our FixMyPark example +this would be C<templates/web/fixmypark> for the web templates and +C<templates/email/fixmypark> for the email templates. + +The full set of templates is stored in the default Cobrand and if no +equivalent template is found in a Cobrand directory FixMyStreet will +use the default template. + +At a bare minimum you will probably want to copy the header and footer +web templates found in C<templates/web/default/header.html> and +C<templates/web/default/footer.html> into your Cobrand and make appropriate +changes. + +The other template you should make your own version of is the FAQ which +is in C<templates/web/default/faq-en-gb.html> + +=head1 CSS + +The CSS is stored in web/css/ under which there are directories for Cobrands +but this is only by custom. The loading of the css is controled by the header +templates. Note that FixMyStreet uses sccs files to generate our CSS so by there +are no CSS files until C<bin/make_css> has been run. + +The CSS provided with FixMyStreet uses CSS3 media queries in order to adapt +the layout to work on different devices. + +The CSS is structured into two main files: + +=over + +=item core.css + +This contains all the styling for the content of the pages. This should not +need changed unless you are significantly changing the layout of the site. + +=item main.css + +This contains the CSS for the header and footer as well as the colour scheme. + +=back + +=head1 Cobrand modules + +Much of the rest of the customisation takes place in the Cobrand modules. These +are automatically loaded according to the current Cobrand and can be found in +C<perllib/FixMyStreet/Cobrands/>. There is a default Cobrand ( Default.pm ) which +all Cobrands should inherit from. A Cobrand module can then override any of the +methods from the default Cobrand. + +FixMyStreet uses the hostname of the current request along with the contents +of the C<ALLOWED_COBRANDS> config option to determine which cobrand to use. +C<ALLOWED_COBRANDS> is a list of cobrand names with an optional hostname match. +override. If there is no hostname override then the first cobrand name that +matches all or part of the hostname of the current request is used. If there is +a hostname override then that is compared against the hostname of the current +request. For example if C<ALLOWED_COBRANDS> is + + ALLOWED_COBRANDS: + - fixmypark_fr: 'fr.fixmypark' + - fixmypark + +then a request to www.fixmypark.com will use the fixmypark cobrand but a +request to fr.fixmypark.com will use fixmypark_fr. If no Cobrand listed in +C<ALLOWED_COBRANDS> matches then the default Cobrand will be used. + +This means you can provide multiple Cobrands for the site if you require, e.g. +for providing different languages, and FixMyStreet will use the first match +listed in C<ALLOWED_COBRANDS>. + +Many of the functions in the Cobrand module are used by FixMyStreet in the UK +to allow the site to offer versions localised to a single authority and should +not be needed for most installs. Listed below are the most useful options that +can be changed. + +=over + +=item site_title + +This should be set to the name of your site. + +=item country + +This should be set to the two letter ISO code for the country your site is for. + +=item disambiguate_location + +This is used by the Geocoding module of FixMyStreet to constrain the area for +which results are returned when locating an address. It should return a hash +reference of parameters that are compatible with the arguments of the geocoding module +you are using. + +At a most basic level it should limit it to the country you are in: + + sub disambiguate_location { + return { + country => 'uk', + }; + } + +You can limit it to a smaller area using bounding boxes to contrain the area +that the geocoder will consider: + + sub disambiguate_location { + return { + centre => '52.688198,-1.804966', + span => '0.1196,0.218675', + bounds => [ '52.807793,-1.586291', '52.584891,-1.963232' ], + }; + } + +The centre and span are used by the Google geocoding API and the bounds by +Bing. + +Note that these areguments are only as good a limiting results as the API +that they are used by. + +=item geocode_postcode + +This function is used to convert postcodes entered into a latitude and +longitude. If the text passed is not a valid postcode then an error should +be returned. If you do not want to use postcodes and always use a geocoding +service then always return an error. + +If the postcode is valid and can be converted then the return value should +look like this: + + return { latitude => $latitude, longitude => $longitude }; + +If there is an error it should look like this: + + return { error => $error_message }; + +=item find_closest and find_closest_address_for_rss + +These are used to provide information on the closest street to the point of +the address in reports and rss feeds or alerts. + +=item allow_photo_upload + +Return 0 to disable the photo upload field. + +=item allow_photo_display + +Return 0 to disable the display of uploaded photos. + +=item area_types + +If you are using MaPit alongside FixMyStreet this should return a +list of the area type codes that the site will handle. This is used +to filter the data returned from MaPit so that only appropriate areas are +displayed. + +=item remove_redundant_councils + +This is used to filter out any overlapping jurisdictions from MaPit results +where only one of the authorities actually has reponsability for the events +reported by the site. An example would be be a report in a city where MaPit +has an id for the city council and the state council but problems are only +reported to the state. In this case you would remove the id for the the city +council from the results. + +=item short_name + +This is used to turn the full authority name returned by MaPit into a short +name. + +=back + +=head1 Translations and Language + +The translations for FixMyStreet are stored as gettext files and the +language for a Cobrand is set in the C<set_lang_and_domain> call of +the Cobrand module. + +The templates use the C<loc> method to pass strings to gettext for +translation. diff --git a/notes/glossary.txt b/notes/glossary.txt index 0c533a944..5a86e5a63 100644 --- a/notes/glossary.txt +++ b/notes/glossary.txt @@ -1,12 +1,5 @@ Unfamiliar terms that you may come across in the code: - -BCI: Broken Civic Infrastructure - project name before it became FixMyStreet - -still to be found used in some config variable names - MaPit: The mySociety database and web service that maps postcodes and points to current or past administrative area information and polygons for all the United Kingdom. http://mapit.mysociety.org/ - -EvEl: A generic email sending and mailing list functionality, with bounce -detection: https://secure.mysociety.org/cvstrac/dir?d=mysociety/services/EvEl diff --git a/perllib/CrossSell.pm b/perllib/CrossSell.pm index 4a0f31ea8..f9a02a61b 100644 --- a/perllib/CrossSell.pm +++ b/perllib/CrossSell.pm @@ -189,25 +189,25 @@ sub display_advert ($$;$%) { #$c->stash->{scratch} = 'advert=demclub0'; #return display_democracyclub(); - return <<EOF; -<div id="advert_thin"> -<p>Do you have an issue that’s too big for FixMyStreet? -It could be time to petition your council. Try our new site: -<h2 style="margin-top:0; font-size: 150%"> -<a href="http://www.petitionyourcouncil.com/">PetitionYourCouncil</a></p> -</h2> -</div> -EOF +# return <<EOF; +#<div id="advert_thin"> +#<p>Do you have an issue that’s too big for FixMyStreet? +#It could be time to petition your council. Try our new site: +#<h2 style="margin-top:0; font-size: 150%"> +#<a href="http://www.petitionyourcouncil.com/">PetitionYourCouncil</a></p> +#</h2> +#</div> +#EOF #unless (defined $data{done_tms} && $data{done_tms}==1) { - #$c->stash->{scratch} = 'advert=news'; - #my $auth_signature = ''; - #unless (defined $data{emailunvalidated} && $data{emailunvalidated}==1) { - # $auth_signature = mySociety::AuthToken::sign_with_shared_secret($email, mySociety::Config::get('AUTH_SHARED_SECRET')); - #} - #return '<div style="margin: 0 5em; border-top: dotted 1px #666666;">' - # . display_news_form(email => $email, name => $name, signed_email => $auth_signature) - # . '</div>'; + $c->stash->{scratch} = 'advert=news'; + my $auth_signature = ''; + unless (defined $data{emailunvalidated} && $data{emailunvalidated}==1) { + $auth_signature = mySociety::AuthToken::sign_with_shared_secret($email, mySociety::Config::get('AUTH_SHARED_SECRET')); + } + return '<div style="margin: 0 5em; border-top: dotted 1px #666666;">' + . display_news_form(email => $email, name => $name, signed_email => $auth_signature) + . '</div>'; #} my @adverts = ( diff --git a/perllib/FixMyStreet/App/Controller/Photo.pm b/perllib/FixMyStreet/App/Controller/Photo.pm index 3ca7f13a9..8711b19e9 100644 --- a/perllib/FixMyStreet/App/Controller/Photo.pm +++ b/perllib/FixMyStreet/App/Controller/Photo.pm @@ -94,8 +94,7 @@ sub index :LocalRegex('^(c/)?(\d+)(?:\.(full|tn|fp))?\.jpeg$') { sub output : Private { my ( $self, $c, $photo ) = @_; - my $dt = DateTime->now(); - $dt->set_year( $dt->year + 1 ); + my $dt = DateTime->now()->add( years => 1 ); $c->res->content_type( 'image/jpeg' ); $c->res->header( 'expires', DateTime::Format::HTTP->format_datetime( $dt ) ); diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index c61f4847c..8d249b899 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -648,7 +648,7 @@ sub process_user : Private { # The user is trying to sign in. We only care about email from the params. if ( $c->req->param('submit_sign_in') || $c->req->param('password_sign_in') ) { unless ( $c->forward( '/auth/sign_in' ) ) { - $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. Passwords and user accounts are a brand <strong>new</strong> service, so you probably do not have one yet – please fill in the right hand side of this form to get one.'); + $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the ‘sign in by email’ section of the form.'); return 1; } my $user = $c->user->obj; diff --git a/perllib/FixMyStreet/App/Controller/Report/Update.pm b/perllib/FixMyStreet/App/Controller/Report/Update.pm index 600684a40..15444f556 100644 --- a/perllib/FixMyStreet/App/Controller/Report/Update.pm +++ b/perllib/FixMyStreet/App/Controller/Report/Update.pm @@ -122,7 +122,7 @@ sub process_user : Private { # The user is trying to sign in. We only care about email from the params. if ( $c->req->param('submit_sign_in') || $c->req->param('password_sign_in') ) { unless ( $c->forward( '/auth/sign_in', [ $email ] ) ) { - $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. Passwords and user accounts are a brand <strong>new</strong> service, so you probably do not have one yet – please fill in the right hand side of this form to get one.'); + $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the ‘sign in by email’ section of the form.'); return 1; } my $user = $c->user->obj; diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm index 5d70ae113..e7620f755 100644 --- a/perllib/FixMyStreet/App/Controller/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Reports.pm @@ -31,8 +31,6 @@ Show the summary page of all reports. sub index : Path : Args(0) { my ( $self, $c ) = @_; - $c->response->header('Cache-Control' => 'max-age=3600'); - # Fetch all areas of the types we're interested in my $areas_info; eval { @@ -73,6 +71,9 @@ sub index : Path : Args(0) { sprintf(_('The error was: %s'), $@); $c->stash->{template} = 'errors/generic.html'; } + + # Down here so that error pages aren't cached. + $c->response->header('Cache-Control' => 'max-age=3600'); } =head2 index diff --git a/perllib/FixMyStreet/App/Controller/Static.pm b/perllib/FixMyStreet/App/Controller/Static.pm index 2e6bda28c..52b230c27 100755 --- a/perllib/FixMyStreet/App/Controller/Static.pm +++ b/perllib/FixMyStreet/App/Controller/Static.pm @@ -22,6 +22,13 @@ sub about : Global : Args(0) { # don't need to do anything here - should just pass through. } +sub for_councils : Path('/for-councils') : Args(0) { + my ( $self, $c ) = @_; +} +sub for_councils_faq : Path('/for-councils/faq') : Args(0) { + my ( $self, $c ) = @_; +} + sub faq : Global : Args(0) { my ( $self, $c ) = @_; diff --git a/perllib/FixMyStreet/Cobrand.pm b/perllib/FixMyStreet/Cobrand.pm index ad21820d7..647261e32 100644 --- a/perllib/FixMyStreet/Cobrand.pm +++ b/perllib/FixMyStreet/Cobrand.pm @@ -18,31 +18,50 @@ my @ALL_COBRAND_CLASSES = __PACKAGE__->_cobrands; =head2 get_allowed_cobrands -Return an array reference of allowed cobrand subdomains +Return an array reference of allowed cobrand monikers and hostname substrings. =cut sub get_allowed_cobrands { - my $allowed_cobrand_string = FixMyStreet->config('ALLOWED_COBRANDS'); - my @allowed_cobrands = split( /\|/, $allowed_cobrand_string ); + my $class = shift; + my @allowed_cobrands = map { + ref $_ ? { moniker => keys %$_, host => values %$_ } + : { moniker => $_, host => $_ } + } @{ $class->_get_allowed_cobrands }; return \@allowed_cobrands; } +=head2 _get_allowed_cobrands + +Simply returns the config variable (so this function can be overridden in test suite). + +=cut + +sub _get_allowed_cobrands { + return FixMyStreet->config('ALLOWED_COBRANDS'); +} + =head2 available_cobrand_classes @available_cobrand_classes = FixMyStreet::Cobrand->available_cobrand_classes(); -Return an array of all the classes that were found and that have monikers that -match the values from get_allowed_cobrands. +Return an array of all the classes that were found and that have monikers +that match the values from get_allowed_cobrands, in the order of +get_allowed_cobrands. =cut sub available_cobrand_classes { my $class = shift; - my %allowed = map { $_ => 1 } @{ $class->get_allowed_cobrands }; - my @avail = grep { $allowed{ $_->moniker } } @ALL_COBRAND_CLASSES; + my %all = map { $_->moniker => $_ } @ALL_COBRAND_CLASSES; + my @avail; + foreach (@{ $class->get_allowed_cobrands }) { + next unless $all{$_->{moniker}}; + $_->{class} = $all{$_->{moniker}}; + push @avail, $_; + } return @avail; } @@ -60,8 +79,7 @@ sub get_class_for_host { my $host = shift; foreach my $avail ( $class->available_cobrand_classes ) { - my $moniker = $avail->moniker; - return $avail if $host =~ m{$moniker}; + return $avail->{class} if $host =~ /$avail->{host}/; } # if none match then use the default @@ -81,7 +99,7 @@ sub get_class_for_moniker { my $moniker = shift; foreach my $avail ( $class->available_cobrand_classes ) { - return $avail if $moniker eq $avail->moniker; + return $avail->{class} if $moniker eq $avail->{moniker}; } # Special case for old blank cobrand entries in fixmystreet.com. diff --git a/perllib/FixMyStreet/Cobrand/Default.pm b/perllib/FixMyStreet/Cobrand/Default.pm index aeb956680..aacfb5e2b 100644 --- a/perllib/FixMyStreet/Cobrand/Default.pm +++ b/perllib/FixMyStreet/Cobrand/Default.pm @@ -782,28 +782,28 @@ sub council_rss_alert_options { id => sprintf( 'area:%s:%s', $district->{id}, $district->{id_name} ), text => $district_name, rss_text => sprintf( _('RSS feed for %s'), $district_name ), - uri => $c->uri_for( '/rss/areas/' . $district->{short_name} ) + uri => $c->uri_for( '/rss/area/' . $district->{short_name} ) }, { type => 'area', id => sprintf( 'area:%s:%s:%s:%s', $district->{id}, $d_ward->{id}, $district->{id_name}, $d_ward->{id_name} ), text => sprintf( _('%s ward, %s'), $d_ward_name, $district_name ), rss_text => sprintf( _('RSS feed for %s ward, %s'), $d_ward_name, $district_name ), - uri => $c->uri_for( '/rss/areas/' . $district->{short_name} . '/' . $d_ward->{short_name} ) + uri => $c->uri_for( '/rss/area/' . $district->{short_name} . '/' . $d_ward->{short_name} ) }, { type => 'area', id => sprintf( 'area:%s:%s', $county->{id}, $county->{id_name} ), text => $county_name, rss_text => sprintf( _('RSS feed for %s'), $county_name ), - uri => $c->uri_for( '/rss/areas/' . $county->{short_name} ) + uri => $c->uri_for( '/rss/area/' . $county->{short_name} ) }, { type => 'area', id => sprintf( 'area:%s:%s:%s:%s', $county->{id}, $c_ward->{id}, $county->{id_name}, $c_ward->{id_name} ), text => sprintf( _('%s ward, %s'), $c_ward_name, $county_name ), rss_text => sprintf( _('RSS feed for %s ward, %s'), $c_ward_name, $county_name ), - uri => $c->uri_for( '/rss/areas/' . $county->{short_name} . '/' . $c_ward->{short_name} ) + uri => $c->uri_for( '/rss/area/' . $county->{short_name} . '/' . $c_ward->{short_name} ) }; push @reported_to_options, diff --git a/perllib/FixMyStreet/Cobrand/UKCouncils.pm b/perllib/FixMyStreet/Cobrand/UKCouncils.pm index 570c90c46..b40f13d9d 100644 --- a/perllib/FixMyStreet/Cobrand/UKCouncils.pm +++ b/perllib/FixMyStreet/Cobrand/UKCouncils.pm @@ -12,6 +12,10 @@ sub site_restriction { return ( "and council='" . $self->council_id . "'", $self->council_url, { council => sprintf('%d', $self->council_id) } ); } +sub restriction { + return { cobrand => shift->moniker }; +} + sub problems_clause { my $self = shift; return { council => sprintf('%d', $self->council_id) }; @@ -3,8 +3,6 @@ use strict; use warnings; -use List::MoreUtils 'uniq'; - my $root; BEGIN { # add the local perllibs too @@ -17,11 +15,10 @@ BEGIN { # add the local perllibs too # Set the environment for the FixMyStreet project # Add the lib/perl5 in perl-external so that we can load local::lib from there -use lib "$root/perl-external/lib/perl5"; +use lib "$root/local/lib/perl5"; # Add the perl-external dirs properly using local::lib -use local::lib "$root/perl-external"; -use local::lib "$root/perl-external/local-lib"; +use local::lib "$root/local"; use lib "$root/commonlib/perllib"; use lib "$root/perllib"; @@ -29,6 +26,10 @@ for ( "$root/commonlib/perllib", "$root/perllib" ) { $ENV{PERL5LIB} = "$_:$ENV{PERL5LIB}"; } +# need to make sure we fetch this after our libs are in INC as some +# vendor provided versions are old an incompatible with Moose +use List::MoreUtils 'uniq'; + # also set the path to our scripts etc $ENV{PATH} = join ':', uniq "$root/bin", split( m/:/, $ENV{PATH} ); diff --git a/t/app/controller/report_new.t b/t/app/controller/report_new.t index 6da9afa24..625c7531f 100644 --- a/t/app/controller/report_new.t +++ b/t/app/controller/report_new.t @@ -493,7 +493,7 @@ subtest "test password errors for a user who is signing in as they report" => su # check that we got the errors expected is_deeply $mech->form_errors, [ - 'There was a problem with your email/password combination. Passwords and user accounts are a brand new service, so you probably do not have one yet – please fill in the right hand side of this form to get one.' + "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the \x{2018}sign in by email\x{2019} section of the form.", ], "check there were errors"; }; diff --git a/t/app/controller/report_updates.t b/t/app/controller/report_updates.t index 99f1ba62d..9c2b0861b 100644 --- a/t/app/controller/report_updates.t +++ b/t/app/controller/report_updates.t @@ -604,7 +604,7 @@ for my $test ( password_sign_in => 'secret', }, field_errors => [ - "There was a problem with your email/password combination. Passwords and user accounts are a brand new service, so you probably do not have one yet \x{2013} please fill in the right hand side of this form to get one.", + "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the \x{2018}sign in by email\x{2019} section of the form.", 'Please enter your name', # FIXME Not really necessary error ], }, diff --git a/t/cobrand/loading.t b/t/cobrand/loading.t index 405ef4761..bd83da07f 100644 --- a/t/cobrand/loading.t +++ b/t/cobrand/loading.t @@ -14,16 +14,14 @@ use_ok 'FixMyStreet::Cobrand'; ok $allowed, "got the allowed_cobrands"; isa_ok $allowed, "ARRAY"; cmp_ok scalar @$allowed, '>', 1, "got more than one"; - is join( '|', @$allowed ), FixMyStreet->config('ALLOWED_COBRANDS'), - "matches config value"; } # fake the allowed cobrands for testing my $override = Sub::Override->new( # - 'FixMyStreet::Cobrand::get_allowed_cobrands' => + 'FixMyStreet::Cobrand::_get_allowed_cobrands' => sub { return ['emptyhomes'] } ); -is_deeply FixMyStreet::Cobrand->get_allowed_cobrands, ['emptyhomes'], +is_deeply FixMyStreet::Cobrand->get_allowed_cobrands, [ { moniker => 'emptyhomes', host => 'emptyhomes' } ], 'overidden get_allowed_cobrands'; sub run_host_tests { @@ -45,7 +43,7 @@ run_host_tests( # now enable barnet too and check that it works $override->replace( # - 'FixMyStreet::Cobrand::get_allowed_cobrands' => + 'FixMyStreet::Cobrand::_get_allowed_cobrands' => sub { return [ 'emptyhomes', 'barnet' ] } ); diff --git a/templates/email/default/submit-brent.txt b/templates/email/default/submit-brent.txt index fcddcc8f1..4b3e20968 100644 --- a/templates/email/default/submit-brent.txt +++ b/templates/email/default/submit-brent.txt @@ -40,6 +40,5 @@ also welcome any other feedback you may have. FixMyStreet is now available for full integration into council websites, making life easier for both you and your residents. -Read more here: -http://www.mysociety.org/fixmystreet-for-local-council-websites/ +Read more here: http://www.fixmystreet.com/for-councils diff --git a/templates/email/default/submit-example.txt b/templates/email/default/submit-example.txt index 61850cafa..6d1815cd1 100644 --- a/templates/email/default/submit-example.txt +++ b/templates/email/default/submit-example.txt @@ -57,6 +57,5 @@ feedback you may have. FixMyStreet is now available for full integration into council websites, making life easier for both you and your residents. -Read more here: -http://www.mysociety.org/fixmystreet-for-local-council-websites/ +Read more here: http://www.fixmystreet.com/for-councils diff --git a/templates/email/default/submit.txt b/templates/email/default/submit.txt index 2542e786b..20fa17096 100644 --- a/templates/email/default/submit.txt +++ b/templates/email/default/submit.txt @@ -40,6 +40,5 @@ also welcome any other feedback you may have. FixMyStreet is now available for full integration into council websites, making life easier for both you and your residents. -Read more here: -http://www.mysociety.org/fixmystreet-for-local-council-websites/ +Read more here: http://www.fixmystreet.com/for-councils diff --git a/templates/web/default/admin/council_contacts.html b/templates/web/default/admin/council_contacts.html index 75d915a29..acfec3ed4 100644 --- a/templates/web/default/admin/council_contacts.html +++ b/templates/web/default/admin/council_contacts.html @@ -1,8 +1,10 @@ [% INCLUDE 'admin/header.html' title=tprintf(loc('Council contacts for %s'), council_name) -%] +[% IF updated %] <p> <em>[% updated %]</em> </p> +[% END %] <p> [% IF example_pc %] @@ -16,7 +18,10 @@ <h2> Council contacts configured via Open311 </h2> +[% END %] +[% IF c.cobrand.moniker == 'fixmystreet' %] +<p class="error">Do not give these out except to people at the council.</p> [% END %] <form method="post" action="[% c.uri_for('council_contacts', area_id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8"> diff --git a/templates/web/default/faq/faq-en-gb.html b/templates/web/default/faq/faq-en-gb.html index 599d3a37e..ed9d53c24 100755 --- a/templates/web/default/faq/faq-en-gb.html +++ b/templates/web/default/faq/faq-en-gb.html @@ -93,7 +93,7 @@ href="https://secure.mysociety.org/donate/">please do</a>.</dd> to find out where reports go at the moment. Also <a href="/contact">contact us</a> to update the address or addresses we use.</dd> <dt>I’m from a council, can we have FixMyStreet on our website?</dt> - <dd>Yes you can! We offer branded, hosted versions of FixMyStreet for local council websites. <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">Full details</a>.</dd> + <dd>Yes you can! We offer branded, hosted versions of FixMyStreet for local council websites. <a href="/for-councils">Full details</a>.</dd> <dt>Do you remove silly or illegal content?</dt> <dd>FixMyStreet is not responsible for the content and accuracy of material submitted by its users. We reserve the right to edit or remove any diff --git a/templates/web/default/reports/council.html b/templates/web/default/reports/council.html index 797d34d6b..ec9efbdbf 100755 --- a/templates/web/default/reports/council.html +++ b/templates/web/default/reports/council.html @@ -77,13 +77,6 @@ Its area is now covered by <a href="/reports/Bedford">Bedford Borough Council</a [% INCLUDE 'reports/cobrand_stats.html' %] -[% IF c.cobrand.moniker == 'fixmystreet' %] -<p class="promo"> - FixMyStreet is now available for local council websites. - <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">Find out more</a>. -</p> -[% END %] - [% INCLUDE 'pagination.html', param = 'p' %] [% INCLUDE column diff --git a/templates/web/fixmystreet/auth/general.html b/templates/web/fixmystreet/auth/general.html index 67a15cc73..585232bc5 100644 --- a/templates/web/fixmystreet/auth/general.html +++ b/templates/web/fixmystreet/auth/general.html @@ -52,9 +52,9 @@ <label for="name">[% loc('Name') %]</label> <input type="text" name="name" value="" placeholder="[% loc('Your name') %]"> - <label for="password_register">[% loc('Password') %]</label> + <label for="password_register">[% loc('Password (optional)') %]</label> <div class="form-txt-submit-box"> - <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password (optional)') %]"> + <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]"> <input class="green-btn" type="submit" name="email_sign_in" value="[% loc('Sign in') %]"> </div> </div> diff --git a/templates/web/fixmystreet/common_header_tags.html b/templates/web/fixmystreet/common_header_tags.html index f0c6c76a7..ea952ccdc 100644 --- a/templates/web/fixmystreet/common_header_tags.html +++ b/templates/web/fixmystreet/common_header_tags.html @@ -7,6 +7,8 @@ <script src="[% version('/js/modernizr.custom.76759.js') %]" type="text/javascript" charset="utf-8"></script> +<script src="[% version('/js/jquery.placeholder.min.js') %]" type="text/javascript" charset="utf-8"></script> + <script type="text/javascript" src="[% version('/js/geo.min.js') %]"></script> <script type="text/javascript" src="[% version('/cobrands/fixmystreet/fixmystreet.js') %]"></script> diff --git a/templates/web/fixmystreet/faq/faq-en-gb.html b/templates/web/fixmystreet/faq/faq-en-gb.html index 418f4387f..462c43564 100755 --- a/templates/web/fixmystreet/faq/faq-en-gb.html +++ b/templates/web/fixmystreet/faq/faq-en-gb.html @@ -104,7 +104,7 @@ href="https://secure.mysociety.org/donate/">please do</a>.</dd> to find out where reports go at the moment. Also <a href="/contact">contact us</a> to update the address or addresses we use.</dd> <dt>I’m from a council, can we have FixMyStreet on our website?</dt> - <dd>Yes you can! We offer branded, hosted versions of FixMyStreet for local council websites. <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">Full details</a>.</dd> + <dd>Yes you can! We offer branded, hosted versions of FixMyStreet for local council websites. <a href="/for-councils">Full details</a>.</dd> <dt>Do you remove silly or illegal content?</dt> <dd>FixMyStreet is not responsible for the content and accuracy of material submitted by its users. We reserve the right to edit or remove any diff --git a/templates/web/fixmystreet/footer.html b/templates/web/fixmystreet/footer.html index 5ac9c881d..18f7c7b4b 100644 --- a/templates/web/fixmystreet/footer.html +++ b/templates/web/fixmystreet/footer.html @@ -20,7 +20,7 @@ </li> <li> <h4>[% loc('Are you from a council?') %]</h4> - <p>[% loc('Would you like better integration with FixMyStreet? <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">Find out about FixMyStreet for councils</a>.') %]</p> + <p>[% loc('Would you like better integration with FixMyStreet? <a href="/for-councils">Find out about FixMyStreet for councils</a>.') %]</p> </li> </ul> </div> diff --git a/templates/web/fixmystreet/report/display.html b/templates/web/fixmystreet/report/display.html index 03a6f79b5..b7daeca24 100644 --- a/templates/web/fixmystreet/report/display.html +++ b/templates/web/fixmystreet/report/display.html @@ -154,10 +154,10 @@ [% INCLUDE name %] - <label for="password_register">[% loc('Password') %]</label> + <label for="password_register">[% loc('Password (optional)') %]</label> <div class="form-txt-submit-box"> - <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password (optional)') %]"> + <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]"> <input class="green-btn" type="submit" name="submit_register" id="submit_register" value="[% loc('Post') %]"> </div> </div> diff --git a/templates/web/fixmystreet/report/new/fill_in_details_form.html b/templates/web/fixmystreet/report/new/fill_in_details_form.html index d908aee99..283f748ba 100644 --- a/templates/web/fixmystreet/report/new/fill_in_details_form.html +++ b/templates/web/fixmystreet/report/new/fill_in_details_form.html @@ -127,8 +127,8 @@ <p>[% loc('We never show your email address or phone number.') %]</p> </div> - <label for="form_phone">[% loc('Phone number') %]</label> - <input class="" type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number (optional)') %]"> + <label for="form_phone">[% loc('Phone number (optional)') %]</label> + <input class="" type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]"> <div class="form-txt-submit-box"> <input class="green-btn" type="submit" id="submit_register" name="submit_register" value="[% loc('Submit') %]"> @@ -185,13 +185,13 @@ <p>[% loc('Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</p> </div> - <label class="form-focus-hidden" for="form_phone">[% loc('Phone number') %]</label> - <input class="form-focus-hidden" type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number (optional)') %]"> + <label class="form-focus-hidden" for="form_phone">[% loc('Phone number (optional)') %]</label> + <input class="form-focus-hidden" type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]"> - <label class="form-focus-hidden" for="password_register">[% loc('Password') %]</label> + <label class="form-focus-hidden" for="password_register">[% loc('Password (optional)') %]</label> <div class="form-txt-submit-box form-focus-hidden"> - <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password (optional)') %]"> + <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]"> <input class="green-btn" type="submit" id="submit_register" name="submit_register" value="[% loc('Submit') %]"> </div> </div> diff --git a/templates/web/fixmystreet/reports/council.html b/templates/web/fixmystreet/reports/council.html index b426adcaa..cf5729fb3 100755 --- a/templates/web/fixmystreet/reports/council.html +++ b/templates/web/fixmystreet/reports/council.html @@ -84,7 +84,7 @@ [% IF c.cobrand.moniker == 'fixmystreet' %] <p class="promo"> FixMyStreet is now available for local council websites. - <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">Find out more</a>. + <a href="/for-councils">Find out more</a>. </p> [% END %] diff --git a/templates/web/fixmystreet/static/for_councils.html b/templates/web/fixmystreet/static/for_councils.html new file mode 100644 index 000000000..2e83c7c6c --- /dev/null +++ b/templates/web/fixmystreet/static/for_councils.html @@ -0,0 +1,46 @@ +[% INCLUDE 'header.html', title = loc('FixMyStreet for Councils'), bodyclass = 'twothirdswidthpage' %] + +<div class="sticky-sidebar"> + <aside> + <ul class="plain-list"> + <li><strong>FixMyStreet for Councils</strong></li> + <li>Summary</li> + <li><a href="/for-councils/faq">Questions and Answers</a></li> + <li><i>Email us at <a href="mailto:hello@mysociety.org">hello@mysociety.org</a></i></li> + </ul> + </aside> +</div> + +<h1>Shift your problem reporting online: FixMyStreet for Councils</h1> + +<p>Councils everywhere are looking to move street issue reporting online, to make +savings and improve services for their residents. <strong>FixMyStreet for +Councils</strong> is explicitly designed to support the shift to digital. + +<p>FixMyStreet is the most popular online street issue reporting application in +the UK. It’s known for prioritising usability and accessibility – and people +love to use it. With very little cost and effort, your staff and your website’s +users can enjoy its simple yet powerful features. + +<p>Embedding FixMyStreet in your council’s website is simple. As a cloud-based +service, it requires no development work from your team. We will match your +site’s look and feel seamlessly, and provide robust technical support and free +training to council users. We also offer a mobile web version of the product +as well as iPhone and Android apps branded for councils. + +<p>We can also integrate FixMyStreet with your CRM or customer management system, +to ensure automatic two-way updates, saving you even more time and money. + +<img src="/cobrands/fixmystreet/barnet.png" alt="" style="float: right; padding: 0.25em; border: solid 1px #ccc; margin: 1em;"> + +<p>mySociety, the non-profit behind FixMyStreet, is a software provider to over +forty local authorities in the UK. We understand the challenges that councils +face in channel shift, and will bring our passion and expertise to support your +journey. + +<p><a href="http://www.mysociety.org/wp/wp-content/uploads/2012/02/FixMyStreet_for_councils_2012.pdf">FixMyStreet for Councils brochure</a> + +<p>Have questions? Read our <a href="/for-councils/faq">Questions and Answers for Councils</a> +or get in touch at <a href="mailto:hello@mysociety.org">hello@mysociety.org</a>. + +[% INCLUDE 'footer.html' pagefooter = 'yes' %] diff --git a/templates/web/fixmystreet/static/for_councils_faq.html b/templates/web/fixmystreet/static/for_councils_faq.html new file mode 100644 index 000000000..16c7d5cfe --- /dev/null +++ b/templates/web/fixmystreet/static/for_councils_faq.html @@ -0,0 +1,359 @@ +[% INCLUDE 'header.html', title = loc('Questions and Answers :: FixMyStreet for Councils'), bodyclass = 'twothirdswidthpage' %] + +<div class="sticky-sidebar"> + <aside> + <ul class="plain-list"> + <li><strong>FixMyStreet for Councils</strong></li> + <li><a href="/for-councils">Summary</a></li> + <li>Questions and Answers <ul> + <li><a href="#general">General information</a></li> + <li><a href="#implementing">Implementing FixMyStreet for Councils</a></li> + <li><a href="#reporting">Problem reporting</a></li> + <li><a href="#best">Getting the best out of FixMyStreet</a></li> + </ul> </li> + <li><i>Email us at <a href="mailto:hello@mysociety.org">hello@mysociety.org</a></i></li> + </ul> + </aside> +</div> + +<h1>Questions about FixMyStreet for Councils</h1> + +<h2 id="general">General information</h2> + +<dl> + +<dt>What is FixMyStreet For Councils?</dt> + +<dd> +<p>FixMyStreet is a street issue-reporting and mapping application +designed specifically for local authority websites. + +<p>It integrates seamlessly with council websites, fully reflecting their look +and feel. All copy, categories, information, reporting fields and links can be +customised to the specific needs of the council. FixMyStreet can also be +connected to a CRM or fault management system for automatic two-way updates. + +<p>The software is open source and is based on mySociety’s award-winning +FixMyStreet.com platform, which has been operating for five years. It is the +most widely-used street issue web application in the UK, sending over 5,000 +reports to local authorities each month. +</dd> + +<dt>Who built it?</dt> + +<dd> +FixMyStreet for Councils was built by mySociety Ltd, a company registered in +England and Wales, company number 03277032. mySociety Ltd is wholly owned by +the charity UK Citizens Online Democracy (charity number 1076346). All profits +are returned to the charity. +</dd> + +<dt>What are the benefits for councils?</dt> + +<dd> +<p>FixMyStreet for Councils will save you and your residents time. It will reduce duplicate reports and encourage the shift of street issue reporting to the web. + +<p>It also places a highly usable, attractive application on your website, and a very simple channel for responding to your residents if you wish to do so. + +<p>Most councils get a high volume of telephone calls to report street issues - by moving even a small proportion of that online, you can make significant savings over time. +</dd> + +<dt>Why is FixMyStreet more effective than standard reporting forms?</dt> + +<dd> +<p>As a rule, people do not enjoy filling in onerous forms on the web. They +often span several pages and require a lot of personal information – so many +people resort to calling instead. + +<p>Reporting on FixMyStreet is extremely simple and quick. The user pinpoints +the location of the problem on a map, provides a description and a photo if +they have one, and their email address. You’ll receive the email address with +the problem report, so your officers can get in touch if they need to. + +<p>Using a map as a way to locate an issue is very useful – people often don’t +know the exact nearest address, but they can show where it is on a map. + +<p>Finally, FixMyStreet allows you to comment on a report or update its status +– your update will be available for everyone interested to see on the website, +further reducing avoidable contact. +</dd> + +<dt>What is the difference between FixMyStreet.com and FixMyStreet for Councils?</dt> + +<dd> +<p>FixMyStreet.com is a national street issue reporting website that enables +anyone anywhere in Great Britain to report a problem to their council. The +reports are delivered to councils by email. + +<p>FixMyStreet for Councils is a product for council websites to enable their +residents to report issues to them. It becomes a natural part of the council’s +site, can be included in the list of top tasks, integrates council-relevant +information, and can be linked with council’s backoffice. + +<p>It uses the same software platform as the FixMyStreet.com site; issues +reported to a council on its own website are also shown on FixMyStreet.com, and +vice-versa. Read the Implementation FAQ above to learn why this approach really +works. + +</dd> + +<dt>Which councils already have FixMyStreet?</dt> + +<dd> +The London Borough of Bromley will soon be launching our upgraded FixMyStreet +for Councils product. For existing implementations, have a look at the +<a href="http://barnet.fixmystreet.com/">London Borough of Barnet’s website</a> +or <a href="http://southampton.fixmystreet.com/">Southampton City Council’s +website</a>. Meanwhile, West Berkshire Council is an example of a back-office +integration - they receive problems reported on FixMyStreet directly into their +CRM. +</dd> + +<dt>Is there a mobile version of the FixMyStreet for Councils product?</dt> + +<dd> +<p>As more and more people use their smartphones for online tasks, we make it +easy for councils to enable mobile street issue reporting. We offer two +products: +<ul> +<li>A mobile web version of FixMyStreet – this presents users with a +mobile-optimised version of a council FixMyStreet web app, and enables mobile +reporting by simply entering a URL of the council’s web reporting page in their +mobile browser +<li>Mobile Apps - some users do prefer to use downlodable apps, so we are +currently developing iPhone and Android Apps with the capability to include +council branding. If you are interested, <a +href="mailto:hello@mysociety.org">let us know</a>. +</ul> +</dd> + +<dt>What is the cost to councils?</dt> + +<dd> +<ul> +<li>The front end product costs £3,500 in year one, reducing to £1,500 per annum in future years. +<li>The mobile web version costs £3,000 in year one and £1,000 per annum subsequently. +<li>Back-end integration costs depend on the complexity of your systems. Prices start at £3,500 in year one, then £1,500 per annum. +</ul> + +<p>The prices are all-inclusive, covering installation, updates, unlimited +problem reports and user training. There are no hidden fees. Please see <a +href="http://www.mysociety.org/wp/wp-content/uploads/2012/02/FixMyStreet_for_councils_2012.pdf">our +brochure</a> for more detail on what’s included. + +<p>There’s no commitment beyond the first 12 months, so you won’t be locked +into a lengthy contract. + +</dl> +<h2 id="implementing">Implementing FixMyStreet for Councils</h2> +<dl> + +<dt>How easy is it to implement FixMyStreet on a council website?</dt> + +<dd> +Extremely easy. Because we run FixMyStreet as a cloud service, all you need to do is to provide details of your website’s colour scheme, fonts, and any customised links or information you’d like to include. We will do all the work in setting up your issue reporting application. The implementation can take as little as a week, and requires minimal work from your web team. +</dd> + +<dt>Can we integrate FixMyStreet with the council’s CRM or fault management system?</dt> + +<dd> +<p>Absolutely. Integrating with your back-office system ensures maximum efficiencies - all reports go straight into your database. When their status changes, updates can be automatically pushed out onto your website as well as to FixMyStreet.com. We are able to integrate with any back-office system. + +<p>We understand that each council has its own processes which have evolved over time. We will work with you to find the best integration solution to ensure minimum disruption to your work, while helping make your processes simpler and more streamlined. + +<p>If you’d like us to advise on the best integration options for you, get in touch. Our advice is completely free - we are always keen to talk to councils and learn about your needs. +</dd> + +<dt>What is the technical architecture of FixMyStreet?</dt> + +<dd> +<p>FixMyStreet for councils uses the same <a +href="https://github.com/mysociety/fixmystreet">open source code base</a> and +runs on the same servers as the national FixMyStreet site. At the same time it +has been designed to allow customisation of both design and functionality. +Using the URL of the site visited the code determines which version of +FixMyStreet to display and loads the appropriate design and customisations. + +<p>If you have back end integration then new reports to your council will be +sent to your CRM through the agreed mechanism ( e.g. Open311 ). If we cannot +send a report to you then it will be put back on the queue and we will try +again later so you won’t miss any reports. +</dd> + +<dt>Why is linking FixMyStreet for Councils with the national FixMyStreet.com website a good idea?</dt> + +<dd> + +<p>There are three key benefits. First, by using the same underlying platform we can spread the cost of maintaining and hosting the system across the national site and different council users. This helps to keep prices low. Plus, we carry out all the technical maintenance and support, so you don’t need to. + +<p>Second, issues reported on FixMyStreet.com are also shown on your Council’s website, avoiding duplicate reports by different residents. + +<p>Third, the customised features on your own FixMyStreet (such as categories, information you gather from customers, additional details on issues the council is not responsible for, etc) will also be reflected on FixMyStreet.com. So wherever your residents report issues, they will get the right features and information from the council. +</dd> + +<dt>Do you offer training?</dt> + +<dd> +Yes. We offer a free two-hour remote training session to your users. If your location is within two hours’ travel from one of our FixMyStreet team members, we will provide training in person. +</dd> + +<dt>What level of support do you provide after implementation?</dt> + +<dd> +<p>We will provide technical support, address any questions, and make tweaks to your system if required. We will also go out of our way to help you with non-technical issues based on our significant experience with online problem reporting. + +<p>Throughout our contract with you, we will always be available by email or on the phone, and will get back to you quickly. + +</dl> +<h2 id="reporting">Problem reporting</h2> +<dl> + +<dt>Can we customise report categories and information requested?</dt> + +<dd> +<p>Yes. You can add the categories most relevant to your council, and remove ones that are not. Your customised categories will appear on both your website’s FixMyStreet implementation, and on the national FixMystreet.com website. + +<p>You can also customise information requested for each issue type - for example, Southampton council asks its customers to report the approximate pothole size, to help prioritise its work. +</dd> + +<dt>How can we deal with issues that the council is not responsible for?</dt> + +<dd> +Most councils already get residents phoning up or emailing them about problems not within their remit. FixMyStreet can help reduce this in two ways: +We can include the most commonly misreported issues in the categories list so when a users selects these, we can give them alternative contact information. If there are known geographical areas that council is not responsible for, we can alert users to that when they click on the map, provided you have given us this information. +Alternatively, if you have contact details in relevant organisations, we can instead email reports to them, while telling the user that these are not the council’s responsibility. +</dd> + +<dt>How are reports delivered to the council?</dt> + +<dd> +<p>If your FixMyStreet is not integrated with your CRM or back-office system, you will receive reports by email to email addresses that you specify. Different type of problems can be sent to different addresses if you wish. + +<p>With back-office integration, reports will go straight into your CRM or fault management system. +</dd> + +<dt>What information is provided in a problem report?</dt> + +<dd> +<p>You will receive the following information: +<ul> +<li>Issue category +<li>Precise location reported (in both latitude/longitude and easting/northing) +<li>Subject and issue description (we encourage users to give as much detail as possible) +<li>Link to a photo of the problem if the user has added one (we don’t send the actual photos so that we don’t clog your system) +<li>The user’s verified email address and phone number if given, so you can contact them directly if you wish +<li>A link to the issue on FixMyStreet for you to update the issue if required. +</ul> +</dd> + +<dt>How precise is location information provided in FixMyStreet?</dt> + +<dd> +<p>Very. The user clicks on a map that includes useful information for +reporting, such as building positions and footpaths, so they can tell you the +location as precisely as they can. + +<p>This approach also helps capture superior location data even when the user +does not know the exact address. + +<p>We will send you the co-ordinates for the point clicked on the map, as well +as the nearest street address as an additional data point. You can also view +the map directly on the issue report page. +</dd> + +<dt>Can we reflect more granular report statuses than just open and fixed?</dt> + +<dd> +Yes. As a client council you get a selection of problem statuses, including: +Investigating, Planned, In Progress, Fixed and Closed. +</dd> + +</dl> +<h2 id="best">Getting the best out of FixMyStreet</h2> +<dl> + +<dt>Can we add photos showing that council has dealt with an issue?</dt> + +<dd> +Yes - you can easily post a photo as an update to a report on your website. These will also be shown on the national FixMyStreet.com site. +</dd> + +<dt>What can we do to help shift users to online reporting instead of calling us up?</dt> + +<dd> +Online reporting is better for you and your residents, as it’s quick, effective and cheap. Good technology will certainly encourage the shift, but to make it fully effective you could do a a few things to help. +Direct residents to report issues on your website when they are in the telephone queue +When someone reports an issue to your call centre, tell them that next time they can do it much quicker online +Encourage council employees or other relevant organisations to report issues online +Respond to problem reports online, so that your residents know you engage well through this channel. +</dd> + +<dt>How can a council respond to issue reports?</dt> + +<dd> +<p>If you choose the back-office integration option, when an issue status +changes in your CRM or fault management system, it can also automatically +update on both your website and the national FixMyStreet website. This assumes +that your system can support automatic updates (most systems can). + +<p>If your back-office is not integrated, you can still easily respond by +changing the status manually on the website, or adding a few words of +commentary. This simple process is much quicker than a telephone call or email. +</dd> + +<dt>How can we contact the person submitting the report if we need more information?</dt> + +<dd> +Our software encourages users to submit as much information as possible, along with photographs. If you do need additional details, you can either post your question as an update to the issue online, or email the user directly (you will get their email address with the issue report). +</dd> + +<dt>We are unable to fix every problem, in particular in the current budget environment. How do we deal with this?</dt> + +<dd> +<p>Whether reported online or not, there are some issues that a council will +decide not to fix because it needs to prioritise more important problems. + +<p>Our online reporting application gives you a direct channel to explain to +your residents why certain problems cannot be addressed. This will lead to a +more open, constructive relationship. This may be a big culture change - we are +happy to support you with our experience in this area. + +<p>When deciding not to deal with a problem, you can close it so that it does +not show as an open problem. +</dd> + +<dt>We are worried about being swamped with high volume of online reports. What can we do?</dt> + +<dd> +While the volume of online reporting is likely to increase (a good thing, as it +replaces phone calls and alerts you to issues you didn’t know about), it +usually happens gradually, giving you plenty of time to adjust. We can stage +the introduction of your new reporting app to make the process even smoother. +</dd> + +<dt>Does FixMyStreet for Councils offer reporting functionality?</dt> + +<dd> +<p>We are currently working on a new reporting dashboard for councils, +accessible through a separate council log-in. This will have detailed reporting +on issue categories, timelines, statuses and help you identify emerging +hotspots. + +<p>Any new council implementation from April 2012 will have this new +functionality. Please get in touch if you’d like more detail. +</dd> + +<dt>I’d like to discuss options for my council. What do I do?</dt> + +<dd> +<p>Just drop us a line to <a +href="mailto:hello@mysociety.org">hello@mysociety.org</a> and we will get back +to you as soon as possible. + +<p>We will be happy to advise you on the options, and recommend an +implementation approach to fit your needs based on our experience. +</dd> + +</dl> + +[% INCLUDE 'footer.html' pagefooter = 'yes' %] diff --git a/web/cobrands/fixmystreet/barnet.png b/web/cobrands/fixmystreet/barnet.png Binary files differnew file mode 100644 index 000000000..0b373fb30 --- /dev/null +++ b/web/cobrands/fixmystreet/barnet.png diff --git a/web/cobrands/fixmystreet/base.scss b/web/cobrands/fixmystreet/base.scss index 068f33ab6..b0e312375 100644 --- a/web/cobrands/fixmystreet/base.scss +++ b/web/cobrands/fixmystreet/base.scss @@ -285,12 +285,22 @@ h4.static-with-rule{ } } :-moz-placeholder { + color:#888888; font: { style:italic; size:0.9375em; } } :-ms-placeholder { + color:#888888; + font: { + style:italic; + size:0.9375em; + } +} +//this only gets used when the browser doesn't support @placeholder +.placeholder { + color:#888888; font: { style:italic; size:0.9375em; diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js index 29aecef52..c2801c880 100644 --- a/web/cobrands/fixmystreet/fixmystreet.js +++ b/web/cobrands/fixmystreet/fixmystreet.js @@ -3,15 +3,6 @@ * FixMyStreet JavaScript */ -//test for and load placeholder polyfill if neccessary -Modernizr.load({ - test: Modernizr.input.placeholder, - nope: [ - '/js/placeholder_polyfill/placeholder_polyfill.min.css', - '/js/placeholder_polyfill/placeholder_polyfill.jquery.min.js' - ] -}); - function form_category_onchange() { var cat = $('#form_category'); var args = { @@ -91,55 +82,76 @@ $(function(){ $html.removeClass('no-js').addClass('js'); + // Preload the new report pin document.createElement('img').src = '/i/pin-green.png'; - //add mobile class if small screen - if (Modernizr.mq('only screen and (max-width:47.9375em)')) { - $html.addClass('mobile'); - $('#map_box').css({ height: '10em' }); - if (typeof fixmystreet !== 'undefined' && fixmystreet.page == 'around') { - // Immediately go full screen map if on around page - $('#site-header').hide(); + var last_type; + $(window).resize(function(){ + var type = $('#site-header').css('borderTopWidth'); + if (type == '4px') { type = 'mobile'; } + else if (type == '0px') { type = 'desktop'; } + else { return; } + if (last_type == type) { return; } + if (type == 'mobile') { + $html.addClass('mobile'); + $('#map_box').prependTo('.content').css({ + zIndex: '', position: '', + top: '', left: '', right: '', bottom: '', + width: '', height: '10em', + margin: '' + }); + if (typeof fixmystreet !== 'undefined') { + fixmystreet.state_map = ''; // XXX + } + if (typeof fixmystreet !== 'undefined' && fixmystreet.page == 'around') { + // Immediately go full screen map if on around page + $('#site-header').hide(); + $('#map_box').prependTo('.wrapper').css({ + position: 'absolute', + top: 0, left: 0, right: 0, bottom: 0, + height: 'auto', + margin: 0 + }); + $('#fms_pan_zoom').css({ top: '2.75em !important' }); + $('.big-green-banner') + .addClass('mobile-map-banner') + .appendTo('#map_box') + .text('Place pin on map') + .prepend('<a href="/">home</a>'); + } + } else { + // Make map full screen on non-mobile sizes. + $html.removeClass('mobile'); + var map_pos = 'fixed', map_height = '100%'; + if ($html.hasClass('ie6')) { + map_pos = 'absolute'; + map_height = $(window).height(); + } $('#map_box').prependTo('.wrapper').css({ - position: 'absolute', + zIndex: 0, position: map_pos, top: 0, left: 0, right: 0, bottom: 0, - height: 'auto', + width: '100%', height: map_height, margin: 0 }); - // Bit yucky, but the ID doesn't exist yet. - $("<style>#fms_pan_zoom { top: 2.75em !important; }</style>").appendTo(document.documentElement); - $('.big-green-banner') - .addClass('mobile-map-banner') - .removeClass('.big-green-banner') - .appendTo('#map_box') - .text('Place pin on map') - .prepend('<a href="/">home</a>'); - } - } else { - // Make map full screen on non-mobile sizes. - var map_pos = 'fixed', map_height = '100%'; - if ($html.hasClass('ie6')) { - map_pos = 'absolute'; - map_height = $(window).height(); - } - $('#map_box').prependTo('.wrapper').css({ - zIndex: 0, position: map_pos, - top: 0, left: 0, right: 0, bottom: 0, - width: '100%', height: map_height, - margin: 0 - }); - if (typeof fixmystreet !== 'undefined') { - fixmystreet.state_map = 'full'; + if (typeof fixmystreet !== 'undefined') { + fixmystreet.state_map = 'full'; + } + if (typeof fixmystreet !== 'undefined' && fixmystreet.page == 'around') { + // Remove full-screen-ness + $('#site-header').show(); + $('#fms_pan_zoom').css({ top: '4.75em !important' }); + $('.big-green-banner') + .removeClass('mobile-map-banner') + .prependTo('#side') + .text('Click map to report a problem'); + } } - } + last_type = type; + }); - //heightfix the desktop .content div - if(Modernizr.mq('only screen and (min-width:48em)')) { - if (!($('body').hasClass('frontpage'))){ - heightFix(window, '.content', -176); - } - } + //add mobile class if small screen + $(window).resize(); $('#pc').focus(); @@ -546,6 +558,18 @@ $.fn.drawer = function(id, ajax) { 'overlayColor': '#000000' }); + /* + * heightfix the desktop .content div + * + * this must be kept near the end so that the + * rendered height is used after any page manipulation (such as tabs) + */ + if (!$('html.mobile').length) { + if (!($('body').hasClass('frontpage'))){ + heightFix(window, '.content', -176); + } + } + }); /* diff --git a/web/cobrands/fixmystreet/images/ie_logo.gif b/web/cobrands/fixmystreet/images/ie_logo.gif Binary files differindex 66dd1de22..cfcbd258b 100644 --- a/web/cobrands/fixmystreet/images/ie_logo.gif +++ b/web/cobrands/fixmystreet/images/ie_logo.gif diff --git a/web/cobrands/fixmystreet/layout.scss b/web/cobrands/fixmystreet/layout.scss index 6247c7474..ff75409ec 100644 --- a/web/cobrands/fixmystreet/layout.scss +++ b/web/cobrands/fixmystreet/layout.scss @@ -570,8 +570,15 @@ body.twothirdswidthpage { .ie6, .ie7 { #user-meta { z-index:1; + p { + top:-2em; + } } } +.ie6 #user-meta { + width:57em; //ie6 doesn't like max-width +} + // Wraps around #key-tools box - sticks to the bottom of the screen on desktop diff --git a/web/js/fixmystreet.js b/web/js/fixmystreet.js index b1a8f1889..834aa4ed3 100644 --- a/web/js/fixmystreet.js +++ b/web/js/fixmystreet.js @@ -8,7 +8,7 @@ function form_category_onchange() { var args = { category: cat.val() }; - + if ( typeof fixmystreet !== 'undefined' ) { args.latitude = fixmystreet.latitude; args.longitude = fixmystreet.longitude; @@ -159,8 +159,9 @@ $(function(){ timer = window.setTimeout(email_alert_close, 2000); }); - - $('#form_category').change( form_category_onchange ); + // Using delegate here because we *might* be running under a cobrand which isn't jQuery 1.7+ + // Delegation is necessary because #form_category may be replaced during the lifetime of the page + $("#problem_form").delegate("select#form_category", "change", form_category_onchange ); // Geolocation if (geo_position_js.init()) { diff --git a/web/js/jquery.placeholder.min.js b/web/js/jquery.placeholder.min.js new file mode 100644 index 000000000..122277a31 --- /dev/null +++ b/web/js/jquery.placeholder.min.js @@ -0,0 +1,2 @@ +/*! http://mths.be/placeholder v2.0.5 by @mathias */ +;(function(f,h,$){var a='placeholder' in h.createElement('input'),d='placeholder' in h.createElement('textarea'),i=$.fn,c=$.valHooks,k,j;if(a&&d){j=i.placeholder=function(){return this};j.input=j.textarea=true}else{j=i.placeholder=function(){var l=this;l.filter((a?'textarea':':input')+'[placeholder]').not('.placeholder').bind({'focus.placeholder':b,'blur.placeholder':e}).data('placeholder-enabled',true).trigger('blur.placeholder');return l};j.input=a;j.textarea=d;k={get:function(m){var l=$(m);return l.data('placeholder-enabled')&&l.hasClass('placeholder')?'':m.value},set:function(m,n){var l=$(m);if(!l.data('placeholder-enabled')){return m.value=n}if(n==''){m.value=n;if(m!=h.activeElement){e.call(m)}}else{if(l.hasClass('placeholder')){b.call(m,true,n)||(m.value=n)}else{m.value=n}}return l}};a||(c.input=k);d||(c.textarea=k);$(function(){$(h).delegate('form','submit.placeholder',function(){var l=$('.placeholder',this).each(b);setTimeout(function(){l.each(e)},10)})});$(f).bind('beforeunload.placeholder',function(){$('.placeholder').each(function(){this.value=''})})}function g(m){var l={},n=/^jQuery\d+$/;$.each(m.attributes,function(p,o){if(o.specified&&!n.test(o.name)){l[o.name]=o.value}});return l}function b(m,n){var l=this,o=$(l);if(l.value==o.attr('placeholder')&&o.hasClass('placeholder')){if(o.data('placeholder-password')){o=o.hide().next().show().attr('id',o.removeAttr('id').data('placeholder-id'));if(m===true){return o[0].value=n}o.focus()}else{l.value='';o.removeClass('placeholder')}}}function e(){var q,l=this,p=$(l),m=p,o=this.id;if(l.value==''){if(l.type=='password'){if(!p.data('placeholder-textinput')){try{q=p.clone().attr({type:'text'})}catch(n){q=$('<input>').attr($.extend(g(this),{type:'text'}))}q.removeAttr('name').data({'placeholder-password':true,'placeholder-id':o}).bind('focus.placeholder',b);p.data({'placeholder-textinput':q,'placeholder-id':o}).before(q)}p=p.removeAttr('id').hide().prev().attr('id',o).show()}p.addClass('placeholder');p[0].value=p.attr('placeholder')}else{p.removeClass('placeholder')}}}(this,document,jQuery));
\ No newline at end of file diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js index 6ffcb5c1d..89c862847 100644 --- a/web/js/map-OpenLayers.js +++ b/web/js/map-OpenLayers.js @@ -210,6 +210,10 @@ $(function(){ displayProjection: new OpenLayers.Projection("EPSG:4326") }); + if ($('html').hasClass('mobile')) { + $('#fms_pan_zoom').css({ top: '2.75em !important' }); + } + fixmystreet.layer_options = OpenLayers.Util.extend({ zoomOffset: fixmystreet.zoomOffset, transitionEffect: 'resize', @@ -428,11 +432,6 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { }, function(data) { $('#councils_text').html(data.councils_text); $('#form_category_row').html(data.category); - /* Need to reset this here as it gets removed when we replace - the HTML for the dropdown */ - if ( data.has_open311 > 0 ) { - $('#form_category').change( form_category_onchange ); - } }); $('#side-form, #site-logo').show(); diff --git a/web/js/placeholder_polyfill/placeholder_polyfill.jquery.min.js b/web/js/placeholder_polyfill/placeholder_polyfill.jquery.min.js deleted file mode 100644 index 0c2f19be5..000000000 --- a/web/js/placeholder_polyfill/placeholder_polyfill.jquery.min.js +++ /dev/null @@ -1,23 +0,0 @@ -/** -* HTML5 placeholder polyfill -* -* code: https://github.com/ginader/HTML5-placeholder-polyfill -* please report issues at: https://github.com/ginader/HTML5-placeholder-polyfill/issues -* -* Copyright (c) 2012 Dirk Ginader (ginader.de) -* Dual licensed under the MIT and GPL licenses: -* http://www.opensource.org/licenses/mit-license.php -* http://www.gnu.org/licenses/gpl.html -* -* Version: 1.8 -*/ -(function(e){var b=false;function c(f,g){if(e.trim(f.val())===""){f.data("placeholder").removeClass(g.hideClass);}else{f.data("placeholder").addClass(g.hideClass); -}}function a(h,g){var f=g.is("textarea");h.css({width:g.innerWidth()-(f?20:4),height:g.innerHeight()-6,lineHeight:g.css("line-height"),whiteSpace:f?"normal":"nowrap",overflow:"hidden"}).offset(g.offset()); -}function d(f){if(b&&window.console&&window.console.log){window.console.log(f);}}e.fn.placeHolder=function(f){var g=this;this.options=e.extend({className:"placeholder",visibleToScreenreaders:true,visibleToScreenreadersHideClass:"placeholder-hide-exept-screenreader",visibleToNoneHideClass:"placeholder-hide"},f); -this.options.hideClass=this.options.visibleToScreenreaders?this.options.visibleToScreenreadersHideClass:this.options.visibleToNoneHideClass;return e(this).each(function(){var h=e(this),l=h.attr("placeholder"),m=h.attr("id"),i,k,j; -i=h.closest("label")[0];h.attr("placeholder","");if(!i&&!m){d("the input element with the placeholder needs an id!");return;}i=i||e('label[for="'+m+'"]'); -if(!i){d("the input element with the placeholder needs a label!");return;}i.removeClass("visuallyhidden").addClass("visuallyhidden-with-placeholder");k=e('<span class="'+g.options.className+'">'+l+"</span>").appendTo(i); -j=(k.width()>h.width());if(j){k.attr("title",l);}a(k,h);h.data("placeholder",k);k.data("input",k);k.click(function(){e(this).data("input").focus();});h.focusin(function(){e(this).data("placeholder").addClass(g.options.hideClass); -});h.focusout(function(){c(e(this),g.options);});c(h,g.options);e(document).bind("fontresize",function(){a(k,h);});if(e.event.special.resize){e("textarea").bind("resize",function(n){a(k,h); -});}else{e("textarea").css("resize","none");}});};e(function(){if("placeholder" in e("<input>")[0]){return;}e("input[placeholder], textarea[placeholder]").placeHolder({visibleToScreenreaders:true}); -});})(jQuery);
\ No newline at end of file diff --git a/web/js/placeholder_polyfill/placeholder_polyfill.min.css b/web/js/placeholder_polyfill/placeholder_polyfill.min.css deleted file mode 100644 index 602cf1fe3..000000000 --- a/web/js/placeholder_polyfill/placeholder_polyfill.min.css +++ /dev/null @@ -1,2 +0,0 @@ -label span.placeholder{position:absolute;font-size:75%;color:#999;font-family:sans-serif;padding:4px 3px;z-index:1}label span.placeholder-hide-exept-screenreader{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);padding:0!important;border:0!important;height:1px!important;width:1px!important;overflow:hidden} -label span.placeholder-hide{display:none}label.visuallyhidden-with-placeholder{clip:auto!important;height:auto!important;overflow:visible!important;position:absolute!important;left:-999em}
\ No newline at end of file diff --git a/web/js/southampton.js b/web/js/southampton.js index 1f3e16105..c0fa48b06 100644 --- a/web/js/southampton.js +++ b/web/js/southampton.js @@ -15,13 +15,16 @@ $(function(){ } }).blur(function(){ var input = $(this); - if (input.val() == '' || input.val() == input.attr('placeholder')) { + if (input.val() === '' || input.val() == input.attr('placeholder')) { input.css({ 'color': '#999999' }); input.val(input.attr('placeholder')); } }).blur(); - - $('#form_category').change(function(){ + + // use on() here because the #form_category may be replaced + // during the page's lifetime + $("#problem_form").on("change.southampton", "select#form_category", + function() { var category = $(this).val(); if ('Potholes' == category) { if (!$('#potholes_extra').length) { @@ -39,12 +42,13 @@ $(function(){ '<option>Deeper than a tennis ball' + '</select></div></div>'; $('#form_title').closest('div.form-field').after(qns); - } + } $('#potholes_extra').show('fast'); } else { $('#potholes_extra').hide('fast'); - } - }).change(); + } + } + ).change(); // change called to trigger (in case we've come in with potholes selected) }); |