Switch to Sub::Exporter, use meta_type in PPB
[gitmo/Perl-Critic-Dynamic-Moose.git] / lib / Perl / Critic / Policy / DynamicMoose / ProhibitPublicBuilders.pm
CommitLineData
84a1bb62 1package Perl::Critic::Policy::DynamicMoose::ProhibitPublicBuilders;
ac490c58 2use Moose;
84a1bb62 3extends 'Perl::Critic::Policy::DynamicMoose';
ac490c58 4
7b3c959c 5use Perl::Critic::Util::Moose 'meta_type';
6
9e6b568b 7Readonly::Scalar my $EXPL => q{Prefix builder method names with an underscore};
ac490c58 8
914f300c 9augment applies_to_metaclass => sub { 'Moose::Meta::Role' };
10
ac490c58 11sub violates_metaclass {
12 my $self = shift;
13 my $meta = shift;
14
336800ce 15 my $classname = $meta->name;
16
ac490c58 17 my @violations;
18
19 my $attributes = $meta->get_attribute_map;
20 for my $name (keys %$attributes) {
21 my $attribute = $attributes->{$name};
914f300c 22 my $builder;
ac490c58 23
914f300c 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 }
336800ce 33
34 if ($builder !~ /^_/) {
7b3c959c 35 my $type = meta_type($meta);
36 my $desc = "Builder method '$builder' of attribute '$attribute' of $type '$classname' is public";
336800ce 37 push @violations, $self->violation($desc, $EXPL);
ac490c58 38 }
39 }
40
41 return @violations;
42}
43
ac490c58 44no Moose;
45
461;
47