Permalink
Browse files

cpanfile plugin!

  • Loading branch information...
rjbs committed Apr 1, 2012
1 parent 8f9d6ea commit 2ae2e7acacbd9c99afdf60475baebb8e01f1586d
Showing with 80 additions and 0 deletions.
  1. +1 −0 Changes
  2. +2 −0 dist.ini
  3. +77 −0 lib/Dist/Zilla/Plugin/CPANFile.pm
View
@@ -1,6 +1,7 @@
Revision history for {{$dist->name}}
{{$NEXT}}
+ added the CPANFile plugin to create "cpanfile" prereq format
4.300013 2012-03-31 15:55:47 Europe/Paris
dzil test has a new option, --all, which is the equivalent of
View
@@ -39,3 +39,5 @@ Config::MVP::Reader::INI = 2 ; ensure there's a basic config format
remove = Config ; why isn't this indexed?? -- rjbs, 2011-02-11
remove = Dist::Zilla::Tester::_Role ; mistakenly added by autoprereq
remove = Some::Package::That::Does::Not::Exist::Due::To::A::Typo
+
+[CPANFile]
@@ -0,0 +1,77 @@
+package Dist::Zilla::Plugin::CPANFile;
+# ABSTRACT: produce a cpanfile prereqs file
+use Moose;
+use Moose::Autobox;
+with 'Dist::Zilla::Role::FileGatherer';
+
+use namespace::autoclean;
+
+use Dist::Zilla::File::FromCode;
+
+=head1 DESCRIPTION
+
+This plugin will add a F<cpanfile> file to the distribution.
+
+=attr filename
+
+If given, parameter allows you to specify an alternate name for the generated
+file. It defaults, of course, to F<cpanfile>.
+
+=cut
+
+has filename => (
+ is => 'ro',
+ isa => 'Str',
+ default => 'cpanfile',
+);
+
+sub _hunkify_hunky_hunk_hunks {
+ my ($self, $indent, $type, $req) = @_;
+
+ my $str = '';
+ for my $module (sort $req->required_modules) {
+ my $vstr = $req->requirements_for_module($module);
+ $str .= qq{$type "$module" => "$vstr";\n};
+ }
+ $str =~ s/^/' ' x $indent/egm;
+ return $str;
+}
+
+sub gather_files {
+ my ($self, $arg) = @_;
+
+ my $zilla = $self->zilla;
+
+ my $file = Dist::Zilla::File::FromCode->new({
+ name => $self->filename,
+ code => sub {
+ my $prereqs = $zilla->prereqs;
+
+ my @types = qw(requires recommends suggests conflicts);
+ my @phases = qw(runtime build test configure develop);
+
+ my $str = '';
+ for my $phase (@phases) {
+ for my $type (@types) {
+ my $req = $prereqs->requirements_for($phase, $type);
+ next unless $req->required_modules;
+ $str .= qq[\non '$phase' => sub {\n] unless $phase eq 'runtime';
+ $str .= $self->_hunkify_hunky_hunk_hunks(
+ ($phase eq 'runtime' ? 0 : 1),
+ $type,
+ $req,
+ );
+ $str .= qq[};\n] unless $phase eq 'runtime';
+ }
+ }
+
+ return $str;
+ },
+ });
+
+ $self->add_file($file);
+ return;
+}
+
+__PACKAGE__->meta->make_immutable;
+1;

0 comments on commit 2ae2e7a

Please sign in to comment.