package Module::CPANTS::Generator::Prereq; use strict; use Carp; use File::Spec::Functions; use vars qw($recursive $requires $VERSION); use Module::CPANTS::Generator; use base 'Module::CPANTS::Generator'; $VERSION = "0.005"; sub generate { my $self = shift; my $cpants = $self->grab_cpants; my $cp = $self->cpanplus || croak("No CPANPLUS object"); my $count = 0; my $total; local($requires, $recursive); my($requires_module); foreach my $dist (sort grep { -d } <*>) { my $filename = catfile($dist, 'Makefile.PL'); $count++; next unless -f $filename; open(IN, $filename); my $m = join '', ; close IN; my $p = $1 if $m =~ m/PREREQ_PM.*?=>.*?\{(.*?)\}/s; next unless $p; # get rid of lines which are only comments $p = join "\n", grep { $_ !~ /^\s*#/ } split "\n", $p; # get rid of empty lines $p = join "\n", grep { $_ !~ /^\s*$/ } split "\n", $p; if ($p =~ /=>/ or $p =~ /,/) { my $prereqs; my $code = "{no strict; \$prereqs = { $p\n}}"; eval $code; # print "WARN: $p\n$@\n" if $@; foreach my $k (sort keys %$prereqs) { my $d2 = $cp->module_tree->{$k}; if (not defined $d2) { # print "$k not found ($dist)\n"; next; } $requires_module->{$dist}->{$k} = $prereqs->{$k}; $requires->{$dist}->{$d2->package}++; $total->{$k}++; } } elsif ($p) { # print "??? uhoh: $p\n"; } } foreach my $o (sort keys %$requires) { foreach my $p (sort keys %{$requires->{$o}}) { $self->fill($o, $p); } } my $requires_array = $self->fold($requires); my $recursive_array = $self->fold($recursive); foreach my $k (keys %$requires) { $cpants->{cpants}->{$k}->{requires_module} = $requires_module->{$k}; $cpants->{cpants}->{$k}->{requires} = $requires_array->{$k}; $cpants->{cpants}->{$k}->{requires_recursive} = $recursive_array->{$k}; } $self->save_cpants($cpants); return $count; } sub fill { my($self, $key, $value) = @_; return if $recursive->{$key}->{$value}++; my $c = $requires->{$value}; foreach my $d (sort keys %$c) { $self->fill($key, $d); } } sub fold { my($self, $hash) = @_; my $folded; foreach my $d (sort keys %$hash) { $folded->{$d} = [sort keys %{$hash->{$d}}]; } return $folded; } 1; __END__ =head1 NAME Module::CPANTS::Generator::Prereq - Generate prereq =head1 SYNOPSIS use Module::CPANTS::Generator::Prereq; my $p = Module::CPANTS::Generator::Prereq->new; $p->cpanplus($cpanplus); $p->directory("unpacked"); $p->generate; =head1 DESCRIPTION This module is part of the beta CPANTS project. It scans through an unpacked CPAN looking for Makefile.PLs and adds prerequisite informatin. =head1 AUTHOR Leon Brocard =head1 LICENSE This code is distributed under the same license as Perl.