1 package Perl::Critic::Policy::DynamicMoose;
4 extends 'Perl::Critic::DynamicPolicy';
8 isa => 'PPI::Document',
9 handles => [qw/ppi_document/],
12 sub applies_to { 'PPI::Document' }
13 sub applies_to_metaclass { 'Class::MOP::Class', inner() }
15 around violation => sub {
23 my $doc = $self->ppi_document;
24 $element = $doc->find('PPI::Element')->[0];
27 return $self->$orig($desc, $expl, $element, @_);
30 sub violates_dynamic {
34 $self->document($doc);
35 $self->compile_document;
37 my @packages = $self->find_packages;
40 for my $package (@packages) {
41 my $meta = Class::MOP::class_of($package)
44 grep { $meta->isa($_) } $self->applies_to_metaclass
47 push @violations, $self->violates_metaclass($meta, $doc);
53 sub compile_document {
55 my $doc = $self->document;
57 my $source_code = $doc->content;
61 die "Unable to execute " . $doc->filename . ": $@" if $@;
66 my $doc = $self->document;
68 return map { $_->namespace }
69 @{ $doc->find('PPI::Statement::Package') || [] };