1 package Perl::Critic::Policy::DynamicMoose::RequireMethodModifiers;
3 extends 'Perl::Critic::Policy::DynamicMoose';
5 use Perl::Critic::Utils ':severities';
6 use Perl::Critic::Utils::Moose 'meta_type';
8 Readonly::Scalar my $EXPL => q{Method modifiers make it clear that you're overriding methods.};
9 sub default_severity { $SEVERITY_LOW }
11 sub violates_metaclass {
17 my $map = $meta->get_method_map;
19 for my $name (keys %$map) {
20 my $method = $map->{$name};
22 # Modifiers are always fine.
23 next if $method->isa('Class::MOP::Method::Wrapped')
24 || $method->isa('Moose::Meta::Method::Overridden')
25 || $method->isa('Moose::Meta::Method::Augmented');
28 next if $method->isa('Class::MOP::Method::Generated');
30 # XXX: this freaking sucks
31 next if $name eq 'meta' || $name eq 'BUILD' || $name eq 'DEMOLISH';
33 my $next = $meta->find_next_method_by_name($name);
35 # Adding new methods is always fine.
38 push @violations, $self->violation("The '$name' method of class " . $meta->name . " does not use a method modifier to override its superclass implementation.", $EXPL);
52 Perl::Critic::Policy::DynamicMoose::RequireMethodModifiers
59 B<VERY IMPORTANT:> Most L<Perl::Critic> Policies (including all the ones that
60 ship with Perl::Critic> use pure static analysis -- they never compile nor
61 execute any of the code that they analyze. However, this policy is very
62 different. It actually attempts to compile your code and then compares the
63 subroutines mentioned in your code to those found in the symbol table.
64 Therefore you should B<not> use this Policy on any code that you do not trust,
65 or may have undesirable side-effects at compile-time (such as connecting to the
66 network or mutating files).
68 For this Policy to work, all the modules included in your code must be
69 installed locally, and must compile without error.
73 Shawn M Moore, C<sartak@bestpractical.com>