File Coverage

blib/lib/Perl/Critic/Policy/ValuesAndExpressions/ProhibitAccessOfPrivateData.pm
Criterion Covered Total %
statement 33 33 100.0
branch 9 10 90.0
condition 8 9 88.8
subroutine 11 11 100.0
pod 4 5 80.0
total 65 68 95.5


line stmt bran cond sub pod time code
1             package Perl::Critic::Policy::ValuesAndExpressions::ProhibitAccessOfPrivateData;
2              
3 3     3   296939 use strict;
  3         9  
  3         114  
4 3     3   17 use warnings;
  3         6  
  3         91  
5 3     3   2190 use Readonly;
  3         7779  
  3         186  
6              
7 3     3   4392 use Perl::Critic::Utils qw{ :severities };
  3         678773  
  3         135  
8 3     3   1869 use base 'Perl::Critic::Policy';
  3         5  
  3         4185  
9              
10 3     3   257903 use version; our $VERSION = qv('v1.0.0');
  3         7099  
  3         20  
11              
12             Readonly::Scalar my $DESC =>
13             q(Private Member Data shouldn't be accessed directly.);
14             Readonly::Scalar my $EXPL =>
15             q(Accessing an objects data directly breaks encapsulation and )
16             . q(should be avoided. Example: $object->{ some_key });
17              
18 11     11 0 113294 sub supported_parameters { return; }
19 6     6 1 1299 sub default_severity { return $SEVERITY_HIGHEST; }
20 1     1 1 11 sub default_themes { return qw/nits maintenance/; }
21 11     11 1 150103 sub applies_to { return qw/PPI::Token::Symbol/; }
22              
23             sub violates {
24 17     17 1 545 my( $self, $element, $document ) = @_;
25 17 50       96 return unless $element->isa('PPI::Token::Symbol');
26              
27 17         89 my $sibling = $element->snext_sibling();
28 17 100       461 return unless $sibling;
29             return
30 15 100 100     279 unless( $sibling->isa('PPI::Token::Operator')
31             && $sibling eq '->' );
32              
33 10         16092 while( my $next_sibling = $sibling->snext_sibling() ) {
34             return
35 28 100 66     811 if $next_sibling->isa('PPI::Token::Structure')
36             && $next_sibling eq q(;);
37 25 100 100     182 if( $next_sibling->isa('PPI::Structure::Subscript')
38             && $element !~ m/(?:self|class|package)/ ) {
39 5         85 return $self->violation( $DESC, $EXPL, $element, );
40             }
41 20         118 $sibling = $next_sibling;
42             }
43 2         55 return;
44             }
45              
46             1;
47              
48             __END__
49              
50             =pod
51              
52             =head1 NAME
53              
54             Perl::Critic::Policy::ValuesAndExpressions::ProhibitAccessOfPrivateData
55              
56             =head1 AFFILIATION
57              
58             This policy is part of L<Perl::Critic::Nits>.
59              
60             =head1 VERSION
61              
62             This document describes Perl::Critic::Policy::ValuesAndExpressions::ProhibitAccessOfPrivateData version 1.0.0
63              
64             =head1 SYNOPSIS
65              
66             Requires that modules and scripts do not break encapsulation by directly
67             accessing the contents of hash-based objects.
68              
69             =head1 DESCRIPTION
70              
71             Accessing an objects data directly breaks encapsulation and
72             should be avoided. Example: $object->{ some_key }.
73              
74             Care should be taken to only access private data via the getter and
75             setter methods provided by the class.
76              
77             =head1 INTERFACE
78              
79             Stadard for a L<Perl::Critic::Policy>.
80              
81             =head1 DIAGNOSTICS
82              
83             None.
84              
85             =head1 CONFIGURATION AND ENVIRONMENT
86              
87             This policy has no configuration options beyond the standard ones.
88              
89             =head1 DEPENDENCIES
90              
91             L<Perl::Critic>
92              
93             =head1 INCOMPATIBILITIES
94              
95             None reported.
96              
97             =head1 BUGS AND LIMITATIONS
98              
99             No bugs have been reported.
100              
101             False positives may be encountered if, internal to a module, the code does
102             not use $self, $class, or $package to refer to the object it represents.
103              
104             Please report any bugs or feature requests to
105             C<bug-perl-critic-nits@rt.cpan.org>, or through the web interface at
106             L<http://rt.cpan.org>.
107              
108             =head1 AUTHOR
109              
110             Kent Cowgill, C<< <kent@c2group.net> >>
111              
112             =head1 LICENSE AND COPYRIGHT
113              
114             Copyright (c) 2007, Kent Cowgill C<< <kent@c2group.net> >>.
115             All rights reserved.
116              
117             This module is free software; you can redistribute it and/or modify it under
118             the same terms as Perl itself. See L<perlartistic>.
119              
120             =cut
121              
122             # setup vim: set filetype=perl tabstop=4 softtabstop=4 expandtab :
123             # setup vim: set shiftwidth=3 textwidth=78 nowrap autoindent :