Implementation of ClassOverridesRole
[gitmo/Perl-Critic-Dynamic-Moose.git] / lib / Perl / Critic / Policy / DynamicMoose / ClassOverridesRole.pm
1 package Perl::Critic::Policy::DynamicMoose::ClassOverridesRole;
2 use Moose;
3 extends 'Perl::Critic::Policy::DynamicMoose';
4
5 use Perl::Critic::Utils ':severities';
6
7 Readonly::Scalar my $EXPL => q{Explicitly exclude overriden methods};
8 sub default_severity { $SEVERITY_MEDIUM }
9
10 # Class::MOP::Class has no roles
11 sub applies_to_metaclass { 'Moose::Meta::Class' }
12
13 sub violates_metaclass {
14     my $self  = shift;
15     my $class = shift;
16
17     my @violations;
18
19     for my $application ($class->role_applications) {
20         my $role = $application->role;
21         for my $method ($role->get_method_list) {
22             next if $application->is_method_excluded($method);
23
24             my $method_object = $class->get_method($method)
25                 or next;
26
27             # no metadata, should check source role to make sure it's the
28             # same as $role
29             next if $method_object->isa('Moose::Meta::Role::Method');
30
31             my $class_name = $class->name;
32             my $role_name  = $role->name;
33
34             my $desc = "Class '$class_name' method '$method' implicitly overrides the same method from role '$role_name'";
35             push @violations, $self->violation($desc, $EXPL);
36         }
37     }
38
39     return @violations;
40 }
41
42 no Moose;
43
44 1;
45
46 __END__
47
48 =head1 NAME
49
50 Perl::Critic::Policy::DynamicMoose::ClassOverridesRole
51
52 =head1 DESCRIPTION
53
54
55 =head1 WARNING
56
57 B<VERY IMPORTANT:> Most L<Perl::Critic> Policies (including all the ones that
58 ship with Perl::Critic> use pure static analysis -- they never compile nor
59 execute any of the code that they analyze.  However, this policy is very
60 different.  It actually attempts to compile your code and then compares the
61 subroutines mentioned in your code to those found in the symbol table.
62 Therefore you should B<not> use this Policy on any code that you do not trust,
63 or may have undesirable side-effects at compile-time (such as connecting to the
64 network or mutating files).
65
66 For this Policy to work, all the modules included in your code must be
67 installed locally, and must compile without error.
68
69 =head1 AUTHOR
70
71 Shawn M Moore, C<sartak@bestpractical.com>
72
73 =cut
74