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