summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dist.ini3
-rw-r--r--lib/Dist/Zilla/Plugin/Boilerplate.pm73
-rw-r--r--t/lib/TestModule2.pm4
3 files changed, 46 insertions, 34 deletions
diff --git a/dist.ini b/dist.ini
index 7db1a0d..8ecc53f 100644
--- a/dist.ini
+++ b/dist.ini
@@ -8,6 +8,9 @@ version = 0.001
[@Basic]
+[PruneFiles]
+matches = ~$
+
[Boilerplate / foo]
code_line = our $foo = 1;
code_line = our $bar = 2;
diff --git a/lib/Dist/Zilla/Plugin/Boilerplate.pm b/lib/Dist/Zilla/Plugin/Boilerplate.pm
index 13b087e..cf80b9a 100644
--- a/lib/Dist/Zilla/Plugin/Boilerplate.pm
+++ b/lib/Dist/Zilla/Plugin/Boilerplate.pm
@@ -31,7 +31,7 @@ has code_line => (
required => 1,
);
-sub code { shift->code_line->join("\n") }
+sub code { shift->code_line->join("\n")."\n" }
has _parsed_code => (
is => 'ro',
@@ -98,52 +98,57 @@ sub munge_files {
sub munge_file {
my ($self, $file) = @_;
- my $doc = $self->ppi_document_for_file($file);
- my $my_uses = $doc->find(
- sub{
- my $element = $_[1];
- $element->isa('PPI::Statement::Include') &&
- $element->type eq 'use' &&
- $element->module eq __PACKAGE__
- }
- );
+ my ($doc,$my_uses) = $self->_find_uses($file);
return unless $my_uses;
+
for my $use ($my_uses->flatten) {
my $tags = $self->_find_tags_from_ppi($use->arguments);
- if ($tags->first(sub{$_ eq $self->plugin_name})) {
+ if ($tags->grep(sub{$_ eq $self->plugin_name})->length) {
for my $elem ($self->_parsed_code->children) {
- $use->insert_before($elem)
+ $use->insert_before($elem->clone)
or $self->log_fatal("Couldn't insert $elem before $use\n");
}
- $use->delete;
}
}
- $self->save_ppi_document_to_file($doc,$file);
+ $file->content($doc->serialize);
+}
+
+sub _find_uses {
+ my ($self,$file) = @_;
+
+ my $content = $file->content;
+ my $doc = PPI::Document->new(\$content);
+ return $doc,$doc->find(
+ sub{
+ my $element = $_[1];
+ $element->isa('PPI::Statement::Include') &&
+ $element->type eq 'use' &&
+ $element->module eq __PACKAGE__
+ }
+ );
}
sub _find_tags_from_ppi {
- my ($self,$node) = @_;
+ my ($self,@nodes) = @_;
- if ($node->isa('PPI::Token::Quote')) {
- return [$node->string];
- }
- elsif ($node->isa('PPI::Token::QuoteLike::Words')) {
- return [$node->literal];
- }
- elsif ($node->isa('PPI::Token')) {
- return [ $node->content ]; # probably wrong
- }
- elsif ($node->can('find')) {
- return [
- ($node->find('PPI::Token::Quote') || [])
- ->map(sub{$_->string})->flatten(),
- ($node->find('PPI::Token::QuoteLike::Words') || [])
- ->map(sub{$_->literal})->flatten,
- ];
- }
- else {
- return []
+ my @ret;
+ for my $node (@nodes) {
+ if ($node->isa('PPI::Token::Quote')) {
+ push @ret, $node->string;
+ }
+ elsif ($node->isa('PPI::Token::QuoteLike::Words')) {
+ push @ret, $node->literal;
+ }
+ elsif ($node->can('find')) {
+ push @ret, (
+ ($node->find('PPI::Token::Quote') || [])
+ ->map(sub{$_->string})->flatten(),
+ ($node->find('PPI::Token::QuoteLike::Words') || [])
+ ->map(sub{$_->literal})->flatten,
+ );
+ }
}
+ return \@ret;
}
}
package Dist::Zilla::Plugin::Boilerplate::Chrome;{
diff --git a/t/lib/TestModule2.pm b/t/lib/TestModule2.pm
new file mode 100644
index 0000000..15d7e21
--- /dev/null
+++ b/t/lib/TestModule2.pm
@@ -0,0 +1,4 @@
+package TestModule2;
+use Dist::Zilla::Plugin::Boilerplate 'bar';
+
+1;