Basic implementation of much of Perl::Critic::Policy::Dynamic::Moose
[gitmo/Perl-Critic-Dynamic-Moose.git] / lib / Perl / Critic / Policy / Dynamic / Moose.pm
CommitLineData
a3c86d00 1package Perl::Critic::Policy::Dynamic::Moose;
2use Moose;
8f31d0d0 3use MooseX::NonMoose;
a3c86d00 4extends 'Perl::Critic::DynamicPolicy';
5
8f31d0d0 6has document => (
7 is => 'rw',
8 isa => 'PPI::Document',
9);
10
11sub applies_to_metaclass { 'Class::MOP::Class' }
12
13around violation => sub {
14 my $orig = shift;
15 my $self = shift;
16 my $desc = shift;
17 my $expl = shift;
18 my $doc = shift || $self->document;
19
20 return $self->$orig($desc, $expl, $doc, @_);
21};
22
a3c86d00 23sub violates_dynamic {
24 my $self = shift;
25 my $doc = shift;
26
8f31d0d0 27 $self->document($doc);
28 $self->compile_document;
29
30 my @packages = $self->find_packages;
31
32 my @violations;
33 for my $package (@packages) {
34 my $meta = Class::MOP::class_of($package);
35 next unless grep { $meta->isa($_) } $self->applies_to_metaclass;
36
37 push @violations, $self->violates_metaclass($meta, $doc);
38 }
39
40 return @violations;
41}
42
43sub compile_document {
44 my $self = shift;
45 my $doc = $self->document;
46
47 eval "$doc";
48}
49
50sub find_packages {
51 my $self = shift;
52 my $doc = $self->document;
a3c86d00 53
8f31d0d0 54 return map { $_->namespace }
55 @{ $doc->find('PPI::Statement::Package') || [] };
a3c86d00 56}
57
58__PACKAGE__->meta->make_immutable;
59no Moose;
60
611;
62