Perl::Critic::PolicyPerl::Critic::Policy::NamingConventions::Capitalization(3)NAMEPerl::Critic::Policy::NamingConventions::Capitalization - Distinguish
different program components by case.
AFFILIATION
This Policy is part of the core Perl::Critic distribution.
DESCRIPTION
Conway recommends to distinguish different program components by case.
Normal subroutines, methods and variables are all in lower case.
my $foo; # ok
my $foo_bar; # ok
sub foo {} # ok
sub foo_bar {} # ok
my $Foo; # not ok
my $foo_Bar; # not ok
sub Foo {} # not ok
sub foo_Bar {} # not ok
Package and class names are capitalized.
package IO::Thing; # ok
package Web::FooBar # ok
package foo; # not ok
package foo::Bar; # not ok
Constants are in all-caps.
Readonly::Scalar my $FOO = 42; # ok
Readonly::Scalar my $foo = 42; # not ok
There are other opinions on the specifics, for example, in perlstyle.
This policy can be configured to match almost any style that you can
think of.
CONFIGURATION
You can specify capitalization rules for the following things:
"packages", "subroutines", "local_lexical_variables",
"scoped_lexical_variables", "file_lexical_variables",
"global_variables", "constants", and "labels".
"constants" are things declared via constant or Readonly.
use constant FOO => 193;
Readonly::Array my @BAR => qw< a b c >;
"global_variables" are anything declared using "local", "our", or vars.
"file_lexical_variables" are variables declared at the file scope.
"scoped_lexical_variables" are variables declared inside bare blocks
that are outside of any subroutines or other control structures; these
are usually created to limit scope of variables to a given subset of
subroutines. E.g.
sub foo { ... }
{
my $thingy;
sub bar { ... $thingy ... }
sub baz { ... $thingy ... }
}
All other variable declarations are considered
"local_lexical_variables".
Each of the "packages", "subroutines", "local_lexical_variables",
"scoped_lexical_variables", "file_lexical_variables",
"global_variables", "constants", and "labels" options can be specified
as one of ":single_case", ":all_lower", ":all_upper:",
":starts_with_lower", ":starts_with_upper", or ":no_restriction" or a
regular expression; any value that does not start with a colon, ":", is
considered to be a regular expression. The ":single_case" tag means a
name can be all lower case or all upper case. If a regular expression
is specified, it is surrounded by "\A" and "\z".
"packages" defaults to ":starts_with_upper". "subroutines",
"local_lexical_variables", "scoped_lexical_variables",
"file_lexical_variables", and "global_variables" default to
":single_case". And "constants" and "labels" default to ":all_upper".
There are corresponding "package_exemptions", "subroutine_exemptions",
"local_lexical_variable_exemptions",
"scoped_lexical_variable_exemptions",
"file_lexical_variable_exemptions", "global_variable_exemptions",
"constant_exemptions", and "label_exemptions" options that are lists of
regular expressions to exempt from the corresponding capitalization
rule. These values also end up being surrounded by "\A" and "\z".
"package_exemptions" defaults to "main". "global_variable_exemptions"
defaults to "\$VERSION @ISA @EXPORT(?:_OK)? %EXPORT_TAGS \$AUTOLOAD
%ENV %SIG \$TODO". "subroutine_exemptions" defaults to "AUTOLOAD BUILD
BUILDARGS CLEAR CLOSE DELETE DEMOLISH DESTROY EXISTS EXTEND FETCH
FETCHSIZE FIRSTKEY GETC NEXTKEY POP PRINT PRINTF PUSH READ READLINE
SCALAR SHIFT SPLICE STORE STORESIZE TIEARRAY TIEHANDLE TIEHASH
TIESCALAR UNSHIFT UNTIE WRITE" which should cover all the standard Perl
subroutines plus those from Moose.
For example, if you want all local variables to be in all lower-case
and global variables to start with "G_" and otherwise not contain
underscores, but exempt any variable with a name that contains
"THINGY", you could put the following in your .perlcriticrc:
[NamingConventions::Capitalization]
local_lexical_variables = :all_lower
global_variables = G_(?:(?!_)\w)+
global_variable_exemptions = .*THINGY.*
TODO
Handle "use vars". Treat constant subroutines like constant variables.
Handle bareword file handles. There needs to be "schemes" or ways of
specifying "perlstyle" or "pbp". Differentiate lexical Readonly
constants in scopes.
BUGS
This policy won't catch problems with the declaration of $y below:
for (my $x = 3, my $y = 5; $x < 57; $x += 3) {
...
}
AUTHOR
Multiple people
COPYRIGHT
Copyright (c) 2008-2011 Michael G Schwern. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself. The full text of this license can
be found in the LICENSE file included with this module.
perl v5.14.1Perl::Critic::Policy::NamingConventions::Capitalization(3)