Switch to tracking new metaclasses, instead of using PPI
[gitmo/Perl-Critic-Dynamic-Moose.git] / lib / Perl / Critic / Policy / DynamicMoose.pm
index 5d5aad3..729094b 100644 (file)
@@ -1,24 +1,30 @@
-package Perl::Critic::Policy::Dynamic::Moose;
+package Perl::Critic::Policy::DynamicMoose;
 use Moose;
 use MooseX::NonMoose;
 extends 'Perl::Critic::DynamicPolicy';
 
 has document => (
-    is  => 'rw',
-    isa => 'PPI::Document',
+    is      => 'rw',
+    isa     => 'PPI::Document',
+    handles => [qw/ppi_document/],
 );
 
 sub applies_to { 'PPI::Document' }
-sub applies_to_metaclass { 'Class::MOP::Class' }
+sub applies_to_metaclass { 'Class::MOP::Class', inner() }
 
 around violation => sub {
-    my $orig = shift;
-    my $self = shift;
-    my $desc = shift;
-    my $expl = shift;
-    my $doc  = shift || $self->document;
+    my $orig    = shift;
+    my $self    = shift;
+    my $desc    = shift;
+    my $expl    = shift;
+    my $element = shift;
+
+    if (!$element) {
+        my $doc = $self->ppi_document;
+        $element = $doc->find('PPI::Element')->[0];
+    }
 
-    return $self->$orig($desc, $expl, $doc, @_);
+    return $self->$orig($desc, $expl, $element, @_);
 };
 
 sub violates_dynamic {
@@ -26,12 +32,13 @@ sub violates_dynamic {
     my $doc  = shift;
 
     $self->document($doc);
-    $self->compile_document;
 
-    my @packages = $self->find_packages;
+    my $old_packages = $self->find_packages;
+    $self->compile_document;
+    my @new_packages = $self->new_packages($old_packages);
 
     my @violations;
-    for my $package (@packages) {
+    for my $package (@new_packages) {
         my $meta = Class::MOP::class_of($package)
             or next;
 
@@ -57,10 +64,22 @@ sub compile_document {
 
 sub find_packages {
     my $self = shift;
-    my $doc = $self->document;
+    return [ Class::MOP::get_all_metaclass_names ];
+}
+
+sub new_packages {
+    my $self = shift;
+    my $old  = shift;
+    my @new;
+    my %seen;
+
+    $seen{$_} = 1 for @$old;
+
+    for (@{ $self->find_packages }) {
+        push @new, $_ if !$seen{$_}++;
+    }
 
-    return map { $_->namespace }
-           @{ $doc->find('PPI::Statement::Package') || [] };
+    return @new;
 }
 
 no Moose;