1package Perl::Critic::Policy::ControlStructures::ProhibitCStyleForLoops;
2
3use 5.006001;
4use strict;
5use warnings;
6use Readonly;
7
8use Perl::Critic::Utils qw{ :characters :severities };
9use base 'Perl::Critic::Policy';
10
11our $VERSION = '1.140';
12
13#-----------------------------------------------------------------------------
14
15Readonly::Scalar my $DESC => q{C-style "for" loop used};
16Readonly::Scalar my $EXPL => [ 100 ];
17
18#-----------------------------------------------------------------------------
19
20sub supported_parameters { return ()                         }
21sub default_severity     { return $SEVERITY_LOW              }
22sub default_themes       { return qw( core pbp maintenance ) }
23sub applies_to           { return 'PPI::Structure::For'  }
24
25#-----------------------------------------------------------------------------
26
27sub violates {
28    my ( $self, $elem, undef ) = @_;
29
30    if ( _is_cstyle($elem) ) {
31        return $self->violation( $DESC, $EXPL, $elem );
32    }
33    return;    #ok!
34}
35
36sub _is_cstyle {
37    my $elem      = shift;
38    my $nodes_ref = $elem->find('PPI::Token::Structure');
39    return if !$nodes_ref;
40    my @semis     = grep { $_ eq $SCOLON } @{$nodes_ref};
41    return scalar @semis == 2;
42}
43
441;
45
46__END__
47
48#-----------------------------------------------------------------------------
49
50=pod
51
52=head1 NAME
53
54Perl::Critic::Policy::ControlStructures::ProhibitCStyleForLoops - Write C<for(0..20)> instead of C<for($i=0; $i<=20; $i++)>.
55
56=head1 AFFILIATION
57
58This Policy is part of the core L<Perl::Critic|Perl::Critic>
59distribution.
60
61
62=head1 DESCRIPTION
63
64The 3-part C<for> loop that Perl inherits from C is butt-ugly, and
65only really necessary if you need irregular counting.  The very
66Perlish C<..> operator is much more elegant and readable.
67
68    for($i=0; $i<=$max; $i++){      #ick!
69        do_something($i);
70    }
71
72    for(0..$max){                   #very nice
73        do_something($_);
74    }
75
76
77=head1 CONFIGURATION
78
79This Policy is not configurable except for the standard options.
80
81
82=head1 AUTHOR
83
84Jeffrey Ryan Thalhammer <jeff@imaginative-software.com>
85
86=head1 COPYRIGHT
87
88Copyright (c) 2005-2011 Imaginative Software Systems.  All rights reserved.
89
90This program is free software; you can redistribute it and/or modify
91it under the same terms as Perl itself.  The full text of this license
92can be found in the LICENSE file included with this module.
93
94=cut
95
96# Local Variables:
97#   mode: cperl
98#   cperl-indent-level: 4
99#   fill-column: 78
100#   indent-tabs-mode: nil
101#   c-indentation-style: bsd
102# End:
103# ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :
104