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() }
14 sub default_themes { qw(moose dynamic dynamicmoose), inner() }
16 around violation => sub {
24 my $doc = $self->ppi_document;
26 # Without this hack, Storable complains of being unable to reconstruct
27 # overloading for an unknown package (perhaps PPI::Document?). For some
28 # reason it works for PPI::Element. Anyway, this should hopefully be
29 # replaced with a more useful location, something like
30 # ( class:MyClass / attr:foo / builder:build_foo )
31 $element = $doc->find('PPI::Element')->[0];
34 return $self->$orig($desc, $expl, $element, @_);
37 sub violates_dynamic {
41 $self->document($doc);
43 my $old_packages = $self->find_packages;
44 $self->compile_document;
45 my @new_packages = $self->new_packages($old_packages);
48 for my $package (@new_packages) {
49 my $meta = Class::MOP::class_of($package)
52 grep { $meta->isa($_) } $self->applies_to_metaclass
55 push @violations, $self->violates_metaclass($meta, $doc);
61 sub compile_document {
63 my $doc = $self->document;
65 my $source_code = $doc->content;
69 die "Unable to execute " . $doc->filename . ": $@" if $@;
74 return [ Class::MOP::get_all_metaclass_names ];
83 $seen{$_} = 1 for @$old;
85 for (@{ $self->find_packages }) {
86 push @new, $_ if !$seen{$_}++;
100 Perl::Critic::Policy::DynamicMoose
104 The included policies are:
108 =item L<Perl::Critic::Policy::DynamicMoose::ProhibitPublicBuilders>
110 Prohibit public builder methods for attributes. [Severity: 3]
116 Shawn M Moore, C<sartak@bestpractical.com>