Medium severity for PPB
[gitmo/Perl-Critic-Dynamic-Moose.git] / lib / Perl / Critic / Policy / DynamicMoose / ProhibitPublicBuilders.pm
1 package Perl::Critic::Policy::DynamicMoose::ProhibitPublicBuilders;
2 use Moose;
3 extends 'Perl::Critic::Policy::DynamicMoose';
4
5 use Perl::Critic::Utils ':severities';
6 use Perl::Critic::Utils::Moose 'meta_type';
7
8 Readonly::Scalar my $EXPL => q{Prefix builder method names with an underscore};
9 sub default_severity { $SEVERITY_MEDIUM }
10
11 augment applies_to_metaclass => sub { 'Moose::Meta::Role' };
12
13 sub violates_metaclass {
14     my $self = shift;
15     my $meta = shift;
16
17     my $classname = $meta->name;
18
19     my @violations;
20
21     my $attributes = $meta->get_attribute_map;
22     for my $name (keys %$attributes) {
23         my $attribute = $attributes->{$name};
24         my $builder;
25
26         if (blessed($attribute)) {
27             next if !$attribute->has_builder;
28             $builder = $attribute->builder;
29         }
30         else {
31             # Roles suck :(
32             next if !defined($attribute->{builder});
33             $builder = $attribute->{builder};
34         }
35
36         if ($builder !~ /^_/) {
37             my $type = meta_type($meta);
38             my $desc = "Builder method '$builder' of attribute '$attribute' of $type '$classname' is public";
39             push @violations, $self->violation($desc, $EXPL);
40         }
41     }
42
43     return @violations;
44 }
45
46 no Moose;
47
48 1;
49