More default themes
[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
e3f2864c 5use Perl::Critic::Utils ':severities';
8013ebe8 6use Perl::Critic::Utils::Moose 'meta_type';
7b3c959c 7
9e6b568b 8Readonly::Scalar my $EXPL => q{Prefix builder method names with an underscore};
e3f2864c 9sub default_severity { $SEVERITY_MEDIUM }
ac490c58 10
914f300c 11augment applies_to_metaclass => sub { 'Moose::Meta::Role' };
12
ac490c58 13sub violates_metaclass {
14 my $self = shift;
15 my $meta = shift;
16
336800ce 17 my $classname = $meta->name;
18
ac490c58 19 my @violations;
20
21 my $attributes = $meta->get_attribute_map;
22 for my $name (keys %$attributes) {
23 my $attribute = $attributes->{$name};
914f300c 24 my $builder;
ac490c58 25
914f300c 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 }
336800ce 35
36 if ($builder !~ /^_/) {
7b3c959c 37 my $type = meta_type($meta);
38 my $desc = "Builder method '$builder' of attribute '$attribute' of $type '$classname' is public";
336800ce 39 push @violations, $self->violation($desc, $EXPL);
ac490c58 40 }
41 }
42
43 return @violations;
44}
45
ac490c58 46no Moose;
47
481;
49