90155abcf281c612421066d32d980461d4cc29ff
[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 Readonly::Scalar my $EXPL => q{Prefix builder method names with an underscore};
6
7 augment applies_to_metaclass => sub { 'Moose::Meta::Role' };
8
9 sub violates_metaclass {
10     my $self = shift;
11     my $meta = shift;
12
13     my $classname = $meta->name;
14
15     my @violations;
16
17     my $attributes = $meta->get_attribute_map;
18     for my $name (keys %$attributes) {
19         my $attribute = $attributes->{$name};
20         my $builder;
21
22         if (blessed($attribute)) {
23             next if !$attribute->has_builder;
24             $builder = $attribute->builder;
25         }
26         else {
27             # Roles suck :(
28             next if !defined($attribute->{builder});
29             $builder = $attribute->{builder};
30         }
31
32         if ($builder !~ /^_/) {
33             my $desc = "Builder method '$builder' of attribute '$attribute' of class '$classname' is public";
34             push @violations, $self->violation($desc, $EXPL);
35         }
36     }
37
38     return @violations;
39 }
40
41 no Moose;
42
43 1;
44