1Perl::Critic::DEVELOPERU(s3e)r Contributed Perl DocumentaPteiroln::Critic::DEVELOPER(3)
2
3
4

NAME

6       Perl::Critic::DEVELOPER - How to make new Perl::Critic::Policy modules.
7

DESCRIPTION

9       For developers who want to create custom coding standards, the
10       following tells how to create a Policy module for Perl::Critic.
11       Although the Perl::Critic distribution already includes a number of
12       Policies based on Damian Conway's book Perl Best Practices (which will
13       be referred to via "PBP" from here on), Perl::Critic is not limited to
14       his guidelines and can be used to enforce any practice, preference, or
15       style that you want to follow.  You can even write Policies to enforce
16       contradictory guidelines.  All you need to do is write a corresponding
17       Perl::Critic::Policy subclass, which may require as little as 10 lines
18       of code.
19

BACKGROUND

21       The heart of Perl::Critic is PPI, a parser and lexer for Perl.  PPI
22       transforms Perl source code into a Document Object Model (DOM).  Each
23       token in the document is represented by a PPI class, such as
24       PPI::Token::Operator or PPI::Token::Word, and then organized into
25       structure classes, like PPI::Statement::Expression and
26       PPI::Structure::Subroutine. The root node of the hierarchy is the
27       PPI::Document.
28
29       The Perl::Critic engine traverses each node in the PPI::Document tree
30       and invokes each of the Perl::Critic::Policy subclasses at the
31       appropriate node.  The Policy can inspect the node, look at the
32       surrounding nodes, and do whatever else it wants.  If the Policy
33       decides that that a coding standard has been violated, it returns one
34       or more Perl::Critic::Violation objects.  If there are no violations,
35       then the Policy returns nothing.
36
37       Policies are usually written based on existing policies, so let's look
38       at one to see how it works.  The RequireBlockGrep.pm Policy is
39       relatively simple and demonstrates most of the important issues.  The
40       goal of this Policy is to enforce that every call to "grep" uses a
41       block for the first argument and not an expression.  The reasons for
42       this Policy are discussed in detail in PBP.
43

EXAMPLE POLICY

45       First, the Policy module needs to have a name.  Perl::Critic uses
46       Module::Pluggable to automatically discover all modules in the
47       "Perl::Critic::Policy" namespace.  Also, we've adopted the convention
48       of grouping Policies into directories according to the chapters of PBP.
49       Since the goal of this Policy is to enforce the use of block arguments
50       to "grep" and it comes from the "Builtin Functions" chapter of PBP, we
51       call it "Perl::Critic::Policy::BuiltinFunctions::RequireBlockGrep".
52
53           package Perl::Critic::Policy::BuiltinFunctions::RequireBlockGrep;
54
55       Next, we set some pragmas and load the modules that we'll need.  All
56       Policy modules inherit from the Perl::Critic::Policy class, which
57       provides no-op implementations of the basic methods.  Our job is to
58       override these methods to make them do something useful.
59
60       Technically, "use strict" and "use warnings" are optional, but we don't
61       want Perl::Critic to be a hypocrite, now do we?
62
63           use strict;
64           use warnings;
65
66           use Readonly;
67
68           use Perl::Critic::Utils qw{ :severities :classification :ppi };
69           use base 'Perl::Critic::Policy';
70
71           our $VERSION = '1.05';
72
73       Next, we'll declare a description and explanation for this Policy.  The
74       description is always just a string that basically says "this is what's
75       wrong."  The explanation can be either a string with further details,
76       or a reference to an array of integers that correspond to page numbers
77       in PBP.  We make them read-only because they never change.  (See
78       Perl::Critic::ValuesAndExpressions::ProhibitConstantPragma for why we
79       don't "use constant".)
80
81           Readonly::Scalar my $DESC => q{Expression form of "grep"};
82           Readonly::Scalar my $EXPL => [ 169 ];
83
84       Most policies don't need to override the "initialize_if_enabled()"
85       method provided by Perl::Critic::Policy.  However, if your Policy is
86       configurable via .perlcriticrc, you should implement a
87       "supported_parameters()" method and need to implement
88       "initialize_if_enabled()" to examine the $config values.  Since this
89       Policy isn't configurable, we'll declare that by providing an
90       implementation of "supported_parameters()" that returns an empty list.
91
92           sub supported_parameters { return ()                  }
93
94       Next, we define the "default_severity()" method, which must return an
95       integer indicating the severity of violating this Policy.  Severity
96       values range from 1 to 5, where 5 is the "most severe."  In general,
97       level 5 is reserved for things that are frequently misused and/or cause
98       bugs.  Level 1 is for things that are highly subjective or purely
99       cosmetic.  The Perl::Critic::Utils package exports several severity
100       constants that you can use here via the ":severities" tag.
101
102           sub default_severity     { return $SEVERITY_HIGH      }
103
104       Likewise, the "default_themes()" method returns a list of theme names.
105       Themes are intended to be named groups of Policies.  All Policies that
106       ship with Perl::Critic have a "core" theme.  Since use of "grep"
107       without blocks often leads to bugs, we include a "bugs" theme.  And
108       since this Policy comes directly from PBP, this Policy should be a
109       member of the "pbp" theme.
110
111           sub default_themes       { return qw( core bugs pbp ) }
112
113       As a Policy author, you can assign any themes you want to the Policy.
114       If you're publishing a suite of custom Policies, we suggest that you
115       create a unique theme that covers all the Policies in the distribution.
116       That way, users can easily enable or disable all of your policies at
117       once.  For example, Policies in the Perl::Critic::More distribution all
118       have a "more" theme.
119
120       Next, we indicate what elements of the code this Policy will analyze,
121       like statements or variables or conditionals or POD.  These elements
122       are specified as PPI classes such as PPI::Statement,
123       PPI::Token::Symbol, PPI::Structure::Conditional or PPI::Token::Pod
124       respectively.  The "applies_to()" method returns a list of PPI package
125       names.  (You can get that list of available package names via "perldoc
126       PPI".)  As Perl::Critic traverses the document, it will call the
127       "violates()" method from this module whenever it encounters one of the
128       PPI types that are given here.  In this case, we just want to test
129       calls to "grep".  Since the token "grep" is a PPI::Token::Word, we
130       return that package name from the "applies_to()" method.
131
132           sub applies_to           { return 'PPI::Token::Word'  }
133
134       If your Policy needs to analyze several different types of elements,
135       the "applies_to" method may return the name of several PPI packages.
136       If your Policy needs to examine the file as a whole, then the
137       "applies_to" method should return PPI::Document.  Since there is only
138       one PPI::Document element, your Policy would only be invoked once per
139       file.
140
141       Now comes the interesting part.  The "violates()" method does all the
142       work.  It is always called with 2 arguments: a reference to the current
143       PPI element that Perl::Critic is traversing, and a reference to the
144       entire PPI document. [And since this is an object method, there will be
145       an additional argument that is a reference to this object ($self), but
146       you already knew that!]  Since this Policy does not need access to the
147       document as a whole, we ignore the last parameter by assigning to
148       "undef".
149
150           sub violates {
151               my ( $self, $elem, undef ) = @_;
152
153       The "violates()" method then often performs some tests to make sure we
154       have the right "type" of element.  In our example, we know that the
155       element will be a PPI::Token::Word because that's what we declared back
156       in the "applies_to()" method.  However, we didn't specify exactly which
157       "word" we were looking for.  Evaluating a PPI element in a string
158       context returns the literal form of the code.  (You can also use the
159       "content()" method.)  So we make sure that this "PPI::Token::Word" is,
160       in fact, "grep".  If it's not, then we don't need to bother examining
161       it.
162
163               return if $elem ne 'grep';
164
165       The "PPI::Token::Word" class is also used for barewords and methods
166       called on object references.  It is possible for someone to declare a
167       bareword hash key as "%hash = ( grep => 'foo')".  We don't want to test
168       those types of elements because they don't represent function calls to
169       "grep".  So we use one of handy utility functions from
170       Perl::Critic::Utils to make sure that this "grep" is actually in the
171       right context.  (The "is_function_call()" subroutine is brought in via
172       the ":classification" tag.)
173
174               return if ! is_function_call($elem);
175
176       Now that we know this element is a call to the "grep" function, we can
177       look at the nearby elements to see what kind of arguments are being
178       passed to it.  In the following paragraphs, we discuss how to do this
179       manually in order to explore PPI; after that, we'll show how this
180       Policy actually uses facilities provided by Perl::Critic::Utils to get
181       this done.
182
183       Every PPI element is linked to its siblings, parent, and children (if
184       it has any).  Since those siblings could just be whitespace, we use the
185       "snext_sibling()" to get the next code-sibling (the "s" in
186       "snext_sibling" stands for "significant").
187
188               my $sib = $elem->snext_sibling() or return;
189
190       In Perl, the parenthesis around argument lists are usually optional,
191       and PPI packs the elements into a PPI::Structure::List object when
192       parentheses are used.  So if the sibling is a "PPI::Structure::List",
193       we pull out the first (significant) child of that list.  This child
194       will be the first argument to "grep".  If parentheses were not used,
195       then the sibling itself is the first argument.
196
197               my $arg = $sib->isa('PPI::Structure::List') ? $sib->schild(0) : $sib;
198
199       In actuality, this sort of function argument lookup is common, so there
200       is a "first_arg" in Perl::Critic::Utils subroutine available via the
201       ":ppi" tag.  So we use that instead.
202
203               my $arg = first_arg($elem);
204
205       Finally, we now have a reference to the first argument to "grep".  If
206       that argument is a block (i.e. something in curly braces), then it will
207       be a PPI::Structure::Block, in which case our Policy is satisfied and
208       we just return nothing.
209
210               return if !$arg;
211               return if $arg->isa('PPI::Structure::Block');
212
213       But if it is not a PPI::Structure::Block, then we know that this call
214       to "grep" must be using the expression form, and that violates our
215       Policy.  So we create and return a new Perl::Critic::Violation object
216       via the "violation" in Perl::Critic::Policy method, passing in the
217       description, explanation, and a reference to the PPI element that
218       caused the violation.  And that's all there is to it!
219
220               return $self->violation( $DESC, $EXPL, $elem );
221           }
222
223           1;
224
225       One last thing -- people are going to need to understand what is wrong
226       with the code when your Policy finds a problem.  It isn't reasonable to
227       include all the details in your violation description or explanation.
228       So please include a DESCRIPTION section in the POD for your Policy.  It
229       should succinctly describe the behavior and motivation for your Policy
230       and include a few examples of both good and bad code.  Here's an
231       example:
232
233           =pod
234
235           =head1 NAME
236
237           Perl::Critic::Policy::BuiltinFunctions::RequireBlockGrep
238
239
240           =head1 DESCRIPTION
241
242           The expression forms of C<grep> and C<map> are awkward and hard to read.
243           Use the block forms instead.
244
245               @matches = grep  /pattern/,    @list;        #not ok
246               @matches = grep { /pattern/ }  @list;        #ok
247
248               @mapped = map  transform($_),    @list;      #not ok
249               @mapped = map { transform($_) }  @list;      #ok
250
251           =cut
252
253       When your policy has a section like this, users can invoke perlcritic
254       with a "--verbose" parameter of 10 or 11 or with a "%d" escape to see
255       it along with the rest of the output for violations of your policy.
256

MAKING YOUR POLICY CONFIGURABLE

258       Perl::Critic takes care of gathering configuration information for your
259       Policy, from whatever source the user specifies.  (See "CONFIGURATION"
260       in Perl::Critic for the details of how a user specifies the values
261       you're going to receive.)  What your Policy ends up receiving for the
262       value of a parameter is a string with leading and trailing whitespace
263       removed.  By default, you will need to handle conversion of that string
264       to a useful form yourself.  However, if you provide some metadata about
265       your parameters, the parameter handling will be taken care of for you.
266       (Additionally, tools that deal with Policies themselves can use this
267       information to enhance their functionality.  See the perlcritic
268       "--profile-proto" option for an example.)
269
270       You can look at
271       Perl::Critic::Policy::ControlStructures::ProhibitCascadingIfElse for a
272       simple example of a configurable Policy and
273       Perl::Critic::Policy::Documentation::RequirePodSections for a more
274       complex one.
275
276   Do It All Yourself
277       The "initialize_if_enabled()" method for a Policy receives one
278       argument: an instance of Perl::Critic::PolicyConfig.  This method is
279       only called if the user's configuration has enabled the policy.  It
280       returns a boolean stating whether the Policy should continue to be
281       enabled.  Generally, the only reason to return $FALSE is when some
282       external requirement is missing.  For example,
283       Perl::Critic::Policy::CodeLayout::RequireTidyCode disables itself if
284       Perl::Tidy is not installed.
285
286       A basic, do-nothing implementation of "initialize_if_enabled()" would
287       be:
288
289           use Perl::Critic::Utils qw< :booleans >;
290
291           ...
292
293           sub initialize_if_enabled {
294               my ( $self, $config ) = @_;
295
296               return $TRUE;
297           }
298
299       As stated above, what you get in $config are trimmed strings.  For
300       example, if the user's .perlcritic contains
301
302           [Your::Policy]
303           foo          = bar baz
304           factor   =     5.52
305           selections =   2 78 92
306
307       then $config will contain the equivalent of
308
309           my $config = {
310               foo        => 'bar baz',
311               factor     => '5.52',
312               selections => '2 78 92',
313           };
314
315       To make this available to the "violates()" method, the values are
316       usually put into $self under the name of the configuration item
317       prefixed with an underscore.  E.g.
318
319           sub initialize_if_enabled {
320               my ( $self, $config ) = @_;
321
322               $self->{_foo} = $config->get{foo};
323               $self->{_factor} = $config->get{factor};
324               $self->{_selections} = $config->get{selections};
325
326               return $TRUE;
327           }
328
329       Often, you'll want to convert the configuration values into something
330       more useful.  In this example, "selections" is supposed to be a list of
331       integers.  Perl::Critic::Utils contains a number of functions that can
332       help you with this.  Assuming that "violates()" wants to have
333       "selections" as an array, you'll want to have something like this:
334
335           use Perl::Critic::Utils qw{ :booleans :characters :data_conversion };
336
337           sub initialize_if_enabled {
338               my ( $self, $config ) = @_;
339
340               $self->{_foo} = $config->get{foo};
341               $self->{_factor} = $config->get{factor};
342
343               my $selections = $config->get{selections};
344               $selections = defined $selections ? $selections : $EMPTY_STRING;
345               $self->{_selections} = [ words_from_string($selections) ];
346
347               return $TRUE;
348           }
349
350       Since "selections" contains numbers, it may be desirable to change the
351       assignment to look like
352
353           $self->{_selections} = [ map { $_ + 0 } words_from_string($selections) ];
354
355       If "violates()" needs to quickly determine whether a particular value
356       is in "selections", you would want to use a hash instead of an array,
357       like this:
358
359           $self->{_selections} = { hashify( words_from_string($selections) ) };
360
361       For an example of a Policy that has some simple, but non-standard
362       configuration handling, see
363       Perl::Critic::Policy::CodeLayout::RequireTidyCode.
364
365   Note On Constructors
366       It used to be the case that Policies handled configuration by
367       implementing a constructor.  However, there was no requirement to call
368       the base constructor; as long as the Policy ended up being a blessed
369       hash reference, everything was fine.  Unfortunately, this meant that
370       Policies would be loaded and their prerequisites would be "use"d, even
371       if the Policy wasn't enabled, slowing things down.  Also, this severely
372       restricted the core of Perl::Critic's ability to enhance things.  Use
373       of constructors is deprecated and is incompatible with
374       "supported_parameters()" metadata below.  Kindly use
375       "initialize_if_enabled()", instead, to do any sort of set up that you
376       need.
377
378   Providing Basic Configuration Information Via "supported_parameters()"
379       As minimum for a well behaved Policy, you should implement
380       "supported_parameters()" in order to tell the rest of "Perl::Critic"
381       what configuration values the Policy looks for, even if it is only to
382       say that the Policy is not configurable.  In the simple form, this
383       function returns a list of the names of the parameters the Policy
384       supports.  So, for an non-configurable Policy, as in the
385       "RequireBlockGrep" example above, this looked like
386
387           sub supported_parameters { return ()                  }
388
389       For the example being used in the "initialize_if_enabled()" section
390       above, this would be
391
392           sub supported_parameters { return qw< foo factor selections >; }
393
394       Given this information, "Perl::Critic" can tell the user when they have
395       specified a parameter for a Policy which isn't valid, e.g. when they've
396       misspelled the name of the parameter, and can emit the parameter as
397       part of a .perlcriticrc prototype.
398
399       You can provide even more information about your Policy's configuration
400       by giving each parameter a description and a string representation of
401       the default value for the parameter.  You do this by having the values
402       in the list returned by "supported_parameters()" be hash references
403       instead of strings, with keys of "name", "description", and
404       "default_string".  For example,
405
406           sub supported_parameters {
407               return (
408                   {
409                       name           => 'allowed_values',
410                       description    =>
411                           'Individual and ranges of values to allow, and/or "all_integers".',
412                       default_string => '0 1 2',
413                   },
414                   {
415                       name           => 'allowed_types',
416                       description    => 'Kind of literals to allow.',
417                       default_string => 'Float',
418                   },
419               );
420           }
421
422       Note that use of constructors is incompatible with specifying
423       parameters in this way.
424
425   Using "supported_parameters()" to Get It Done For You
426       The "supported_parameters()" discussion above showed how you could help
427       others with your Policy, but didn't do anything to make your life as a
428       Policy author easier; you still need to implement
429       "initialize_if_enabled()" to access any configuration that the user has
430       specified.  To have the configuration automatically handled for you,
431       you need to declare how your parameters act by specifying a value for
432       their "behavior".  For example, the following declares that a parameter
433       allows the user to choose from five specific values and that the user
434       can select any combination of them:
435
436           sub supported_parameters {
437               return (
438                   {
439                       name               => 'allowed_types',
440                       description        => 'Kind of literals to allow.',
441                       default_string     => 'Float',
442                       behavior           => 'enumeration',
443                       enumeration_values => [ qw{ Binary Exp Float Hex Octal } ],
444                       enumeration_allow_multiple_values => 1,
445                   },
446               );
447           }
448
449       When you specify a behavior, parsing and validation of the user-
450       specified and default values is done for you and your "violates()"
451       method can retrieve the value under the key of the parameter name
452       prefixed with an underscore, e.g., for the above declaration, the
453       parsed and validated value can be accessed via
454       "$self->{_allowed_types}".
455
456       The behaviors provide additional functionality to "Perl::Critic"; for
457       more on this, see Perl::Critic::PolicyParameter and
458       Perl::Critic::PolicyParameter::Behavior.
459
460       The following discusses each of the supported behaviors and the options
461       they support.  For the full details of a behavior, see the
462       documentation for the implementing class.
463
464       "string"
465
466       Implemented in Perl::Critic::PolicyParameter::Behavior::String.
467
468       The most basic of behaviors, the value of the parameter will be stored
469       in the Policy as a string.
470
471       This behavior is not configurable.
472
473       "supported_parameters()" example
474
475           sub supported_parameters {
476               return (
477                   {
478                       name           => 'a_string',
479                       description    => 'An example string.',
480                       default_string => 'blah blah blah',
481                       behavior       => 'string',
482                   },
483               );
484           }
485
486       Access example
487
488           sub violates {
489               my ($self, $element, $document) = @_;
490
491               ...
492               my $string = $self->{_a_string};
493               ...
494           }
495
496       "boolean"
497
498       Implemented in Perl::Critic::PolicyParameter::Behavior::Boolean.
499
500       The value of the parameter will be either $TRUE or $FALSE.
501
502       This behavior is not configurable.
503
504       "supported_parameters()" example
505
506           sub supported_parameters {
507               return (
508                   {
509                       name           => 'a_boolean',
510                       description    => 'An example boolean.',
511                       default_string => '1',
512                       behavior       => 'boolean',
513                   },
514               );
515           }
516
517       Access example
518
519           sub violates {
520               my ($self, $element, $document) = @_;
521
522               ...
523               my $is_whatever = $self->{_a_boolean};
524               if ($is_whatever) {
525                   ...
526               }
527               ...
528           }
529
530       "integer"
531
532       Implemented in Perl::Critic::PolicyParameter::Behavior::Integer.
533
534       The value is validated against "m/ \A [-+]? [1-9] [\d_]* \z /xms" (with
535       an special check for "0").  Notice that this means that underscores are
536       allowed in input values as with Perl numeric literals.
537
538       This takes two options, "integer_minimum" and "integer_maximum", which
539       specify endpoints of an inclusive range to restrict the value to.
540       Either, neither, or both may be specified.
541
542       "supported_parameters()" example
543
544           sub supported_parameters {
545               return (
546                   {
547                       name            => 'an_integer',
548                       description     => 'An example integer.',
549                       default_string  => '5',
550                       behavior        => 'integer',
551                       integer_minimum => 0,
552                       integer_maximum => 10,
553                   },
554               );
555           }
556
557       Access example
558
559           sub violates {
560               my ($self, $element, $document) = @_;
561
562               ...
563               my $integer = $self->{_an_integer};
564               if ($integer > $TURNING_POINT) {
565                   ...
566               }
567               ...
568           }
569
570       "string list"
571
572       Implemented in Perl::Critic::PolicyParameter::Behavior::StringList.
573
574       The values will be derived by splitting the input string on blanks.
575       (See "words_from_string" in Perl::Critic::Utils.) The parameter will be
576       stored as a reference to a hash, with the values being the keys.
577
578       This takes one optional option, "list_always_present_values", of a
579       reference to an array of strings that will always be included in the
580       parameter value, e.g. if the value of this option is "[ qw{ a b c } ]"
581       and the user specifies a value of 'c d e', then the value of the
582       parameter will contain 'a', 'b', 'c', 'd', and 'e'.
583
584       "supported_parameters()" example
585
586           sub supported_parameters {
587               return (
588                   {
589                       name                  => 'a_string_list',
590                       description           => 'An example list.',
591                       default_string        => 'red pink blue',
592                       behavior              => 'string list',
593                       list_always_present_values => [ qw{ green purple} ],
594                   },
595               );
596           }
597
598       Access example
599
600           sub violates {
601               my ($self, $element, $document) = @_;
602
603               ...
604               my $list = $self->{_a_string_list};
605               my @list = keys %{$list};
606               ...
607               return if not $list->{ $element->content() };
608               ...
609           }
610
611       "enumeration"
612
613       Implemented in Perl::Critic::PolicyParameter::Behavior::Enumeration.
614
615       The values will be derived by splitting the input string on blanks.
616       (See "words_from_string" in Perl::Critic::Utils.)  Depending upon the
617       value of the "enumeration_allow_multiple_values" option, the parameter
618       will be stored as a string or a reference to a hash, with the values
619       being the keys.
620
621       This behavior takes one required option and one optional one.  A value
622       for "enumeration_values" of a reference to an array of valid strings is
623       required.  A true value can be specified for
624       "enumeration_allow_multiple_values" to allow the user to pick more than
625       one value, but this defaults to false.
626
627       "supported_parameters()" example
628
629           use Perl::Critic::Utils qw{ :characters };
630
631           sub supported_parameters {
632               return (
633                   {
634                       name               => 'a_single_valued_enumeration',
635                       description        =>
636                           'An example enumeration that can only have a single value.',
637                       default_string     => $EMPTY,
638                       behavior           => 'enumeration',
639                       enumeration_values => [ qw{ block statement pod operator } ],
640                       enumeration_allow_multiple_values => 0,
641                   },
642                   {
643                       name               => 'a_multi_valued_enumeration',
644                       description        =>
645                           'An example enumeration that can have multiple values.',
646                       default_string     => 'fe',
647                       behavior           => 'enumeration',
648                       enumeration_values => [ qw{ fe fi fo fum } ],
649                       enumeration_allow_multiple_values => 1,
650                   },
651               );
652           }
653
654       Access example
655
656           sub violates {
657               my ($self, $element, $document) = @_;
658
659               ...
660               my $single_value = $self->{_a_single_valued_enumeration};
661               ...
662               my $multi_value = $self->{_a_multi_valued_enumeration};
663               if ( $multi_value->{fum} ) {
664                   ...
665               }
666               ...
667           }
668
669   Using a Custom Parser
670       If none of the behaviors does exactly what you want it to, you can
671       provide your own parser for a parameter.  The reason for doing this as
672       opposed to using an implementation of "initialize_if_enabled()" is that
673       it allows you to use a behavior to provide its extra functionality and
674       it provides a means for a "Perl::Critic" configuration program, e.g. an
675       IDE that integrates "Perl::Critic", to validate your parameter as the
676       user modifies its value.
677
678       The way you declare that you have a custom parser is to include a
679       reference to it in the parameter specification with the "parser" key.
680       For example:
681
682           sub supported_parameters {
683               return (
684                   {
685                       name           => 'file_name',
686                       description    => 'A file for to read a list of values from.',
687                       default_string => undef,
688                       behavior       => 'string',
689                       parser         => \&_parse_file_name,
690                   },
691               );
692           }
693
694       A parser is a method on a subclass of Perl::Critic::Policy that takes
695       two parameters: the Perl::Critic::PolicyParameter that is being
696       specified and the value string provided by the user.  The method is
697       responsible for dealing with any default value and for saving the
698       parsed value for later use by the "violates()" method.
699
700       An example parser (without enough error handling) for the above example
701       declaration:
702
703           use File::Slurp qw< slurp >;
704
705           use Perl::Critic::Exception::Configuration::Option::Policy::ParameterValue
706               qw{ throw_policy_value };
707
708           sub _parse_file_name {
709               my ($self, $parameter, $config_string) = @_;
710
711               my @thingies;
712
713               if ($config_string) {
714                   if (not -r $config_string) {
715                       throw_policy_value
716                           policy         => $self->get_short_name(),
717                           option_name    => $parameter->get_name(),
718                           option_value   => $config_string,
719                           message_suffix => 'is not readable.';
720                   }
721
722                   @thingies = slurp $config_string;
723               }
724
725               $self->{_thingies} = \@thingies;
726
727               return;
728           }
729
730       Note that, if the value for the parameter is not valid, an instance of
731       Perl::Critic::Exception::Configuration::Option::Policy::ParameterValue
732       is thrown.  This allows "Perl::Critic" to include that problem along
733       with any other problems found with the user's configuration in a single
734       error message.
735
736   Using Both "supported_parameters()" and "initialize_if_enabled()"
737       There are cases where a Policy needs additional initialization beyond
738       configuration or where the way it acts depends upon the combination of
739       multiple parameters.  In such situations, you will need to create an
740       implementation of "initialize_if_enabled()".  If you want to take
741       advantage of the supplied parameter handling from within implementation
742       of "initialize_if_enabled()", note that the information from
743       "supported_parameters()" will already have been used, with user-
744       supplied parameter values validated and placed into the Policy by the
745       time "initialize_if_enabled()" has been called.  It is likely that you
746       will not need to refer the contents of the $config parameter; just pull
747       the information you need out of $self.  In fact, any value for the
748       parameter values will be gone.
749
750   Summary of permitted hash keys in "supported_parameters()".
751       All types
752
753       - "name" (mandatory)
754       - "description" (optional)
755       - "behavior" (optional)
756           Currently, one of:
757
758           "boolean"
759           "enumeration"
760           "integer"
761           "string"
762           "string list"
763       - "default_string" (optional)
764           A string representation of the default value of the parameter.
765
766       - "parser" (optional)
767           A code ref to a custom parser for the parameter.
768
769       Enumerations
770
771       - "enumeration_values" (mandatory)
772           A mandatory reference to an array of strings.
773
774       - "enumeration_allow_multiple_values" (optional)
775           Boolean indicating whether or not the user is restricted to a
776           single value.
777
778       Integers
779
780       - "integer_minimum" (optional)
781           Minimum allowed value, inclusive.
782
783       - "integer_maximum" (optional)
784           Maximum allowed value, inclusive.
785
786       String lists
787
788       - "list_always_present_values" (optional)
789           A reference to an array of values that should always be included in
790           the value of the parameter.
791

ADDITIONAL FEATURES

793   "default_maximum_violations_per_document()"
794       Certain problems that a Policy detects can be endemic to a particular
795       file; if there's one violation, there's likely to be many.  A good
796       example of this is
797       Perl::Critic::Policy::TestingAndDebugging::RequireUseStrict; if there's
798       one line before "use strict", there's a good chance that the entire
799       file is missing "use strict".  In such cases, it's not much help to the
800       user to report every single violation.  If you've got such a policy,
801       you should override default_maximum_violations_per_document() method to
802       provide a limit.  The user can override this value with a value for
803       "maximum_violations_per_document" in their .perlcriticrc.
804
805       See the source code for
806       Perl::Critic::Policy::ValuesAndExpressions::ProhibitMagicNumbers and
807       Perl::Critic::Policy::TestingAndDebugging::RequireUseWarnings for
808       examples.
809

DISTRIBUTING YOUR POLICIES

811   Create a Distribution
812       You need to come up with a name for your set of policies.  Sets of add-
813       on policies are generally named "Perl::Critic::something", e.g.
814       Perl::Critic::More.
815
816       The module representing the distribution will not actually have any
817       functionality; it's just documentation and a name for users to use when
818       installing via CPAN/CPANPLUS.  The important part is that this will
819       include a list of the included policies, with descriptions of each.
820
821       A typical implementation will look like:
822
823           package Perl::Critic::Example;
824
825           use strict;
826           use warnings;
827
828           our $VERSION = '1.000000';
829
830           1; # Magic true value required at end of module
831
832           __END__
833
834           =head1 NAME
835
836           Perl::Critic::Example - Policies for Perl::Critic that act as an example.
837
838           =head1 AFFILIATION
839
840           This module has no functionality, but instead contains documentation
841           for this distribution and acts as a means of pulling other modules
842           into a bundle.  All of the Policy modules contained herein will have
843           an "AFFILIATION" section announcing their participation in this
844           grouping.
845
846
847           =head1 SYNOPSIS
848
849           Some L<Perl::Critic|Perl::Critic> policies that will help you keep your
850           code nice and compliant.
851
852
853           =head1 DESCRIPTION
854
855           The included policies are:
856
857           =over
858
859           =item L<Perl::Critic::Policy::Documentation::Example|Perl::Critic::Policy::Documentation::Example>
860
861           Complains about some example documentation issues.  [Severity: 3]
862
863
864           =item L<Perl::Critic::Policy::Variables::Example|Perl::Critic::Policy::Variables::Example>
865
866           All modules must have at least one variable.  [Severity: 3]
867
868
869           =back
870
871
872           =head1 CONFIGURATION AND ENVIRONMENT
873
874           All policies included are in the "example" theme.  See the
875           L<Perl::Critic|Perl::Critic> documentation for how to make use of this.
876
877   Themes
878       Users can choose which policies to enable using themes.  You should
879       implement "default_themes()" so that users can take advantage of this.
880       In particular, you should use a theme named after your distribution in
881       all your policies; this should match the value listed in the
882       "CONFIGURATION AND ENVIRONMENT" POD section as shown above.
883
884           default_themes { return qw< example math > }
885
886       If you're looking for ideas of what themes to use, have a look at the
887       output of "perlcritic --list-themes".
888
889   Documentation
890       AFFILIATION
891
892       Since all policies have to go somewhere under the
893       "Perl::Critic::Policy::" namespace, it isn't always clear what
894       distribution a policy came from when browsing through their
895       documentation.  For this reason, you should include an "AFFILIATION"
896       section in the POD for all of your policies that state where the policy
897       comes from.  For example:
898
899           =head1 AFFILIATION
900
901           This policy is part of L<Perl::Critic::Example|Perl::Critic::Example>.
902
903       CONFIGURATION
904
905       In order to make it clear what can be done with a policy, you should
906       always include a "CONFIGURATION" section in your POD, even if it's only
907       to say:
908
909           =head1 CONFIGURATION
910
911           This Policy is not configurable except for the standard options.
912

HINT

914       When you're trying to figure out what PPI is going to hand you for a
915       chunk of code, there is a tools/ppidump program in the Perl::Critic
916       distribution that will help you.  For example, when developing the
917       above RequireBlockGrep example, you might want to try
918
919           tools/ppidump '@matches = grep /pattern/, @list;'
920
921       and
922
923           tools/ppidump '@matches = grep { /pattern/ } @list;'
924
925       to see the differences between the two cases.
926
927       Alternatively, see the "ppi_dumper" documentation at
928       <http://search.cpan.org/dist/App-PPI-Dumper/script/ppi_dumper> and the
929       "PPI::Tester" documentation at
930       <http://search.cpan.org/dist/PPI-Tester/lib/PPI/Tester.pm>.
931

VERSION

933       This is part of Perl::Critic version 1.105.
934

AUTHOR

936       Jeffrey Ryan Thalhammer <thaljef@cpan.org>
937
939       Copyright (c) 2005-2009 Jeffrey Ryan Thalhammer.  All rights reserved.
940
941       This program is free software; you can redistribute it and/or modify it
942       under the same terms as Perl itself.  The full text of this license can
943       be found in the LICENSE file included with this module.
944
945
946
947perl v5.10.1                      2010-11-12        Perl::Critic::DEVELOPER(3)
Impressum