Login
Fixed spelling errors
[gknop/Perl-Critic.git] / README
CommitLineData
b9e35135
JRT
1NAME
2 Perl::Critic - Critique Perl source code for best-practices
3
4SYNOPSIS
5 use Perl::Critic;
6 my $file = shift;
7 my $critic = Perl::Critic->new();
8 my @violations = $critic->critique($file);
9 print @violations;
10
11DESCRIPTION
12 Perl::Critic is an extensible framework for creating and applying coding
13 standards to Perl source code. Essentially, it is a static source code
14 analysis engine. Perl::Critic is distributed with a number of
15 Perl::Critic::Policy modules that attempt to enforce various coding
16 guidelines. Most Policy modules are based on Damian Conway's book Perl
17 Best Practices. However, Perl::Critic is not limited to PBP and will
18 even support Policies that contradict Conway. You can enable, disable,
19 and customize those Polices through the Perl::Critic interface. You can
20 also create new Policy modules that suit your own tastes.
21
22 For a convenient command-line interface to Perl::Critic, see the
23 documentation for perlcritic. If you want to integrate Perl::Critic with
24 your build process, Test::Perl::Critic provides an interface that is
25 suitable for test scripts. For the ultimate convenience (at the expense
26 of some flexibility) see the criticism pragma.
27
28 Win32 and ActivePerl users can find PPM distributions of Perl::Critic at
29 <http://theoryx5.uwinnipeg.ca/ppms/>.
30
a3f5707d
JRT
31 If you'd like to try Perl::Critic without installing anything, there is
32 a web-service available at <http://perlcritic.com>. The web-service does
b9e35135
JRT
33 not yet support all the configuration features that are available in the
34 native Perl::Critic API, but it should give you a good idea of what it
a3f5707d
JRT
35 does. You can also invoke the perlcritic web-service from the command
36 line by doing an HTTP-post, such as one of these:
37
38 $> POST http://perlcritic.com/perl/critic.pl < MyModule.pm
39 $> lwp-request -m POST http://perlcritic.com/perl/critic.pl < MyModule.pm
40 $> wget -q -O - --post-file=MyModule.pm http://perlcritic.com/perl/critic.pl
41
42 Please note that the perlcritic web-service is still alpha code. The URL
43 and interface to the service are subject to change.
b9e35135
JRT
44
45CONSTRUCTOR
a3f5707d
JRT
46 "new( [ -profile => $FILE, -severity => $N, -theme => $string, -include
47 => \@PATTERNS, -exclude => \@PATTERNS, -top => $N, -only => $B, -force
48 => $B, -verbose => $N ] )"
49 "new( [ -config => Perl::Critic::Config->new() ]"
50 "new()" Returns a reference to a new Perl::Critic object. Most arguments
b9e35135 51 are just passed directly into Perl::Critic::Config, but I have
a3f5707d
JRT
52 described them here as well. The default value for all arguments
53 can be defined in your .perlcriticrc file. See the
54 "CONFIGURATION" section for more information about that. All
55 arguments are optional key-value pairs as follows:
b9e35135
JRT
56
57 -profile is a path to a configuration file. If $FILE is not
58 defined, Perl::Critic::Config attempts to find a .perlcriticrc
59 configuration file in the current directory, and then in your
60 home directory. Alternatively, you can set the "PERLCRITIC"
61 environment variable to point to a file in another location. If
62 a configuration file can't be found, or if $FILE is an empty
63 string, then all Policies will be loaded with their default
64 configuration. See "CONFIGURATION" for more information.
65
66 -severity is the minimum severity level. Only Policy modules
67 that have a severity greater than $N will be loaded. Severity
68 values are integers ranging from 1 (least severe) to 5 (most
69 severe). The default is 5. For a given "-profile", decreasing
70 the "-severity" will usually result in more Policy violations.
71 Users can redefine the severity level for any Policy in their
72 .perlcriticrc file. See "CONFIGURATION" for more information.
73
a3f5707d
JRT
74 -theme is special string that defines a set of Policies based on
75 their respective themes. If "-theme" is given, only policies
76 that are members of that set will be loaded. For example, the
77 following would load only Policies that have a 'danger' and
78 'pbp' theme:
79
80 my $critic = Perl::Critic->new(-theme => 'danger * pbp');
81
82 See the "POLICY THEMES" section for more information about
83 themes. Unless the "-severity" option is explicitly given,
84 setting "-theme" silently causes the "-severity" to be set to 1.
85
b9e35135
JRT
86 -include is a reference to a list of string @PATTERNS. Policy
87 modules that match at least one "m/$PATTERN/imx" will always be
a3f5707d 88 loaded, irrespective of all other settings. For example:
b9e35135
JRT
89
90 my $critic = Perl::Critic->new(-include => ['layout'] -severity => 4);
91
92 This would cause Perl::Critic to load all the "CodeLayout::*"
93 Policy modules even though they have a severity level that is
94 less than 4. You can use "-include" in conjunction with the
95 "-exclude" option. Note that "-exclude" takes precedence over
96 "-include" when a Policy matches both patterns.
97
98 -exclude is a reference to a list of string @PATTERNS. Policy
99 modules that match at least one "m/$PATTERN/imx" will not be
a3f5707d 100 loaded, irrespective of all other settings. For example:
b9e35135
JRT
101
102 my $critic = Perl::Critic->new(-exclude => ['strict'] -severity => 1);
103
104 This would cause Perl::Critic to not load the "RequireUseStrict"
105 and "ProhibitNoStrict" Policy modules even though they have a
106 severity level that is greater than 1. You can use "-exclude" in
107 conjunction with the "-include" option. Note that "-exclude"
108 takes precedence over "-include" when a Policy matches both
109 patterns.
110
ffe5f1a7
JRT
111 -singlepolicy is a string "PATTERN". Only the policy that
112 matches "m/$PATTERN/imx" will be used. This value overrides the
113 "-severity", "-theme", "-include", "-exclude", and "-only"
114 options.
115
b9e35135 116 -top is the maximum number of Violations to return when ranked
a3f5707d
JRT
117 by their severity levels. This must be a positive integer.
118 Violations are still returned in the order that they occur
119 within the file. Unless the "-severity" option is explicitly
120 given, setting "-top" silently causes the "-severity" to be set
121 to 1.
122
123 -only is a boolean value. If set to a true value, Perl::Critic
124 will only choose from Policies that are mentioned in the user's
125 profile. If set to a false value (which is the default), then
126 Perl::Critic chooses from all the Policies that it finds at your
127 site.
b9e35135
JRT
128
129 -force controls whether Perl::Critic observes the magical ""##
130 no critic"" pseudo-pragmas in your code. If set to a true value,
131 Perl::Critic will analyze all code. If set to a false value
132 (which is the default) Perl::Critic will ignore code that is
133 tagged with these comments. See "BENDING THE RULES" for more
134 information.
135
a3f5707d
JRT
136 -verbose can be a positive integer (from 1 to 10), or a literal
137 format specification. See Perl::Critic::Violations for an
138 explanation of format specifications.
139
b9e35135
JRT
140 -config is a reference to a Perl::Critic::Config object. If you
141 have created your own Config object for some reason, you can
142 pass it in here instead of having Perl::Critic create one for
143 you. Using the "-config" option causes all the other options to
144 be silently ignored.
145
146METHODS
147 "critique( $source_code )"
148 Runs the $source_code through the Perl::Critic engine using all
149 the Policies that have been loaded into this engine. If
150 $source_code is a scalar reference, then it is treated as string
151 of actual Perl code. If $source_code is a reference to an
152 instance of PPI::Document, then that instance is used directly.
153 Otherwise, it is treated as a path to a local file containing
154 Perl code. This method Returns a list of Perl::Critic::Violation
155 objects for each violation of the loaded Policies. The list is
156 sorted in the order that the Violations appear in the code. If
157 there are no violations, this method returns an empty list.
158
a3f5707d 159 "add_policy( -policy => $policy_name, -params => \%param_hash )"
b9e35135 160 Creates a Policy object and loads it into this Critic. If the
a3f5707d
JRT
161 object cannot be instantiated, it will throw a fatal exception.
162 Otherwise, it returns a reference to this Critic.
b9e35135
JRT
163
164 -policy is the name of a Perl::Critic::Policy subclass module.
165 The 'Perl::Critic::Policy' portion of the name can be omitted
166 for brevity. This argument is required.
167
a3f5707d
JRT
168 -params is an optional reference to a hash of Policy parameters.
169 The contents of this hash reference will be passed into to the
170 constructor of the Policy module. See the documentation in the
171 relevant Policy module for a description of the arguments it
172 supports.
b9e35135 173
a3f5707d 174 " policies() "
b9e35135
JRT
175 Returns a list containing references to all the Policy objects
176 that have been loaded into this engine. Objects will be in the
177 order that they were loaded.
178
a3f5707d 179 " config() "
b9e35135
JRT
180 Returns the Perl::Critic::Config object that was created for or
181 given to this Critic.
182
183FUNCTIONAL INTERFACE
184 For those folks who prefer to have a functional interface, The
185 "critique" method can be exported on request and called as a static
186 function. If the first argument is a hashref, its contents are used to
187 construct a new Perl::Critic object internally. The keys of that hash
188 should be the same as those supported by the "Perl::Critic::new" method.
189 Here are some examples:
190
191 use Perl::Critic qw(critique);
192
193 # Use default parameters...
194 @violations = critique( $some_file );
195
196 # Use custom parameters...
197 @violations = critique( {-severity => 2}, $some_file );
198
199 # As a one-liner
200 %> perl -MPerl::Critic=critique -e 'print critique(shift)' some_file.pm
201
202 None of the other object-methods are currently supported as static
203 functions. Sorry.
204
205CONFIGURATION
a3f5707d
JRT
206 Most of the settings for Perl::Critic and each of the Policy modules can
207 be controlled by a configuration file. The default configuration file is
208 called .perlcriticrc. Perl::Critic will look for this file in the
209 current directory first, and then in your home directory. Alternatively,
210 you can set the "PERLCRITIC" environment variable to explicitly point to
211 a different file in another location. If none of these files exist, and
212 the "-profile" option is not given to the constructor, then all the
213 modules that are found in the Perl::Critic::Policy namespace will be
214 loaded with their default configuration.
215
216 The format of the configuration file is a series of INI-style blocks
b9e35135
JRT
217 that contain key-value pairs separated by '='. Comments should start
218 with '#' and can be placed on a separate line or after the name-value
a3f5707d
JRT
219 pairs if you desire.
220
221 Default settings for Perl::Critic itself can be set before the first
222 named block. For example, putting any or all of these at the top of your
223 configuration file will set the default value for the corresponding
224 command-line argument.
225
226 severity = 3 #Integer from 1 to 5
227 only = 1 #Zero or One
228 force = 0 #Zero or One
229 verbose = 4 #Integer or format spec
230 top = 50 #A positive integer
231 theme = risky + (pbp * security) - cosmetic #A theme expression
232 include = NamingConventions ClassHierarchies #Space-delimited list
233 exclude = Variables Modules::RequirePackage #Space-delimited list
234
235 The remainder of the configuration file is a series of blocks like this:
236
237 [Perl::Critic::Policy::Category::PolicyName]
238 severity = 1
ffe5f1a7
JRT
239 set_themes = foo bar
240 add_themes = baz
a3f5707d
JRT
241 arg1 = value1
242 arg2 = value2
b9e35135
JRT
243
244 "Perl::Critic::Policy::Category::PolicyName" is the full name of a
245 module that implements the policy. The Policy modules distributed with
246 Perl::Critic have been grouped into categories according to the table of
247 contents in Damian Conway's book Perl Best Practices. For brevity, you
248 can omit the 'Perl::Critic::Policy' part of the module name.
249
250 "severity" is the level of importance you wish to assign to the Policy.
251 All Policy modules are defined with a default severity value ranging
252 from 1 (least severe) to 5 (most severe). However, you may disagree with
253 the default severity and choose to give it a higher or lower severity,
254 based on your own coding philosophy.
255
256 The remaining key-value pairs are configuration parameters that will be
257 passed into the constructor for that Policy. The constructors for most
258 Policy objects do not support arguments, and those that do should have
259 reasonable defaults. See the documentation on the appropriate Policy
260 module for more details.
261
262 Instead of redefining the severity for a given Policy, you can
263 completely disable a Policy by prepending a '-' to the name of the
264 module in your configuration file. In this manner, the Policy will never
265 be loaded, regardless of the "-severity" given to the Perl::Critic
266 constructor.
267
268 A simple configuration might look like this:
269
a3f5707d
JRT
270 #--------------------------------------------------------------
271 # I think these are really important, so always load them
272
273 [TestingAndDebugging::RequireUseStrict]
274 severity = 5
275
276 [TestingAndDebugging::RequireUseWarnings]
277 severity = 5
b9e35135 278
a3f5707d
JRT
279 #--------------------------------------------------------------
280 # I think these are less important, so only load when asked
b9e35135 281
a3f5707d
JRT
282 [Variables::ProhibitPackageVars]
283 severity = 2
b9e35135 284
a3f5707d
JRT
285 [ControlStructures::ProhibitPostfixControls]
286 allow = if unless #My custom configuration
287 severity = 2
b9e35135 288
a3f5707d
JRT
289 #--------------------------------------------------------------
290 # Give these policies a custom theme. I can activate just
291 # these policies by saying `perlcritic -theme larry`
b9e35135 292
a3f5707d 293 [Modules::RequireFilenameMatchesPackage]
ffe5f1a7 294 add_themes = larry
b9e35135 295
a3f5707d 296 [TestingAndDebugging::RequireTestLables]
ffe5f1a7 297 add_themes = larry curly moe
b9e35135 298
a3f5707d
JRT
299 #--------------------------------------------------------------
300 # I do not agree with these at all, so never load them
b9e35135 301
a3f5707d
JRT
302 [-NamingConventions::ProhibitMixedCaseVars]
303 [-NamingConventions::ProhibitMixedCaseSubs]
b9e35135 304
a3f5707d
JRT
305 #--------------------------------------------------------------
306 # For all other Policies, I accept the default severity,
307 # so no additional configuration is required for them.
b9e35135 308
ffe5f1a7
JRT
309 For additional configuration examples, see the perlcriticrc file that is
310 included in this t/examples directory of this distribution.
311
b9e35135
JRT
312THE POLICIES
313 A large number of Policy modules are distributed with Perl::Critic. They
314 are described briefly in the companion document
315 Perl::Critic::PolicySummary and in more detail in the individual modules
316 themselves.
317
a3f5707d 318POLICY THEMES
ffe5f1a7
JRT
319 NOTE: As of version 0.21, policy themes are still considered
320 experimental. The implementation of this feature may change in a future
321 release. Additionally, the default theme names that ship with
322 Perl::Critic may also change. But this is a pretty cool feature, so read
323 on...
324
a3f5707d
JRT
325 Each Policy is defined with one or more "themes". Themes can be used to
326 create arbitrary groups of Policies. They are intended to provide an
327 alternative mechanism for selecting your preferred set of Policies. The
328 Policies that ship with Perl::Critic have been grouped into themes that
329 are roughly analogous to their severity levels. Folks who find the
330 numeric severity levels awkward can use these mnemonic theme names
331 instead.
332
333 Severity Level Equivalent Theme
334 ---------------------------------------------------------------------------
335 5 danger
336 4 risky
337 3 unreliable
338 2 readability
339 1 cosmetic
340
341 Say "perlcritic -list" to get a listing of all available policies and
342 the themes that are associated with each one. You can also change the
343 theme for any Policy in your .perlcriticrc file. See the "CONFIGURATION"
344 section for more information about that.
345
346 Using the "-theme" command-line option, you can combine themes with
347 mathematical and boolean operators to create an arbitrarily complex
348 expression that represents a custom "set" of Policies. The following
349 operators are supported
350
351 Operator Altertative Meaning
352 ----------------------------------------------------------------------------
353 * and Intersection
354 - not Difference
355 + or Union
356
357 Operator precedence is the same as that of normal mathematics. You can
358 also use parenthesis to enforce precedence. Here are some examples:
359
360 Expression Meaning
361 ----------------------------------------------------------------------------
362 pbp * risky All policies that are "pbp" AND "risky"
363 pbp and risky Ditto
364
365 danger + risky All policies that are "danger" OR "risky"
366 pbp or risky Ditto
367
368 pbp - cosmetic All policies that are "pbp" BUT NOT "risky"
369 pbp not cosmetic Ditto
370
371 -unreliable All policies that are NOT "unreliable"
372 not unreliable Ditto
373
374 (pbp - danger) * risky All policies that are "pbp" BUT NOT "danger", AND "risky"
375 (pbp not danger) and risky Ditto
376
377 Theme names are case-insensitive. If "-theme" is set to an empty string,
378 then it is equivalent to the set of all policies. A theme name that
379 doesn't exist is equivalent to an empty set. Please See
380 <http://en.wikipedia.org/wiki/Set> for a discussion on set theory.
381
b9e35135
JRT
382BENDING THE RULES
383 Perl::Critic takes a hard-line approach to your code: either you comply
384 or you don't. In the real world, it is not always practical (nor even
385 possible) to fully comply with coding standards. In such cases, it is
386 wise to show that you are knowingly violating the standards and that you
387 have a Damn Good Reason (DGR) for doing so.
388
389 To help with those situations, you can direct Perl::Critic to ignore
390 certain lines or blocks of code by using pseudo-pragmas:
391
392 require 'LegacyLibaray1.pl'; ## no critic
393 require 'LegacyLibrary2.pl'; ## no critic
394
395 for my $element (@list) {
396
397 ## no critic
398
399 $foo = ""; #Violates 'ProhibitEmptyQuotes'
400 $barf = bar() if $foo; #Violates 'ProhibitPostfixControls'
401 #Some more evil code...
402
403 ## use critic
404
405 #Some good code...
406 do_something($_);
407 }
408
409 The "## no critic" comments direct Perl::Critic to ignore the remaining
410 lines of code until the end of the current block, or until a "## use
411 critic" comment is found (whichever comes first). If the "## no critic"
412 comment is on the same line as a code statement, then only that line of
413 code is overlooked. To direct perlcritic to ignore the "## no critic"
414 comments, use the "-force" option.
415
416 A bare "## no critic" comment disables all the active Policies. If you
417 wish to disable only specific Policies, add a list of Policy names as
418 arguments, just as you would for the "no strict" or ""no warnings""
419 pragmas. For example, this would disable the "ProhibitEmptyQuotes" and
420 "ProhibitPostfixControls" policies until the end of the block or until
421 the next "## use critic" comment (whichever comes first):
422
423 ## no critic (EmptyQuotes, PostfixControls)
424
425 $foo = ""; #Now exempt from ValuesAndExpressions::ProhibitEmptyQuotes
426 $barf = bar() if $foo; #Now exempt ControlStructures::ProhibitPostfixControls
427 $long_int = 10000000000; #Still subjected to ValuesAndExpression::RequireNumberSeparators
428
429 Since the Policy names are matched against the arguments as regular
430 expressions, you can abbreviate the Policy names or disable an entire
431 family of Policies in one shot like this:
432
433 ## no critic (NamingConventions)
434
435 my $camelHumpVar = 'foo'; #Now exempt from NamingConventions::ProhibitMixedCaseVars
436 sub camelHumpSub {} #Now exempt from NamingConventions::ProhibitMixedCaseSubs
437
438 The argument list must be enclosed in parens and must contain one or
439 more comma-separated barewords (e.g. don't use quotes). The ""## no
440 critic"" pragmas can be nested, and Policies named by an inner pragma
441 will be disabled along with those already disabled an outer pragma.
442
443 Use this feature wisely. "## no critic" should be used in the smallest
444 possible scope, or only on individual lines of code. And you should
445 always be as specific as possible about which policies you want to
446 disable (i.e. never use a bare "## no critic"). If Perl::Critic
447 complains about your code, try and find a compliant solution before
448 resorting to this feature.
449
450IMPORTANT CHANGES
451 Perl-Critic is evolving rapidly, so some of the interfaces have changed
452 in ways that are not backward-compatible. If you have been using an
453 older version of Perl-Critic and/or you have been developing custom
454 Policy modules, please read this section carefully.
455
a3f5707d
JRT
456 VERSION 0.21
457 In version 0.21, we introduced the concept of policy "themes". All you
458 existing custom Policies should still be compatible. But to take
459 advantage of the theme feature, you should add a "default_themes" method
460 to your custom Policy modules. See Perl::Critic::DEVELOPER for an
461 up-to-date guide on creating Policy modules.
462
463 The internals of Perl::Critic were also refactored significantly. The
464 public API is largely unchanged, but if you've been accessing bits
465 inside Perl::Critic, then you may be in for a surprise.
466
b9e35135
JRT
467 VERSION 0.16
468 Starting in version 0.16, you can add a list Policy names as arguments
469 to the "## no critic" pseudo-pragma. This feature allows you to disable
470 specific policies. So if you have been in the habit of adding additional
471 words after "no critic", then those words might cause unexpected
472 results. If you want to append other stuff to the ""## no critic""
473 comment, then terminate the pseudo-pragma with a semi-colon, and then
474 start another comment. For example:
475
a3f5707d
JRT
476 #This may not work as expected.
477 $email = 'foo@bar.com'; ## no critic for literal '@'
b9e35135 478
a3f5707d
JRT
479 #This will work.
480 $email = 'foo@bar.com'; ## no critic; #for literal '@'
b9e35135 481
a3f5707d
JRT
482 #This is even better.
483 $email = 'foo@bar.com'; ## no critic (RequireInterpolation);
b9e35135
JRT
484
485 VERSION 0.14
486 Starting in version 0.14, the interface to Perl::Critic::Violation
487 changed. This will also break any custom Policy modules that you might
488 have written for earlier modules. See Perl::Critic::DEVELOPER for an
489 up-to-date guide on creating Policy modules.
490
491 The notion of "priority" was also replaced with "severity" in version
492 0.14. Consequently, the default behavior of Perl::Critic is to only load
493 the most "severe" Policy modules, rather than loading all of them. This
494 decision was based on user-feedback suggesting that Perl-Critic should
495 be less critical for new users, and should steer them toward gradually
496 increasing the strictness as they progressively adopt better coding
497 practices.
498
499 VERSION 0.11
500 Starting in version 0.11, the internal mechanics of Perl-Critic were
501 rewritten so that only one traversal of the PPI document tree is
502 required. Unfortunately, this will break any custom Policy modules that
503 you might have written for earlier versions. Converting your policies to
504 work with the new version is pretty easy and actually results in cleaner
505 code. See Perl::Critic::DEVELOPER for an up-to-date guide on creating
506 Policy modules.
507
508THE Perl::Critic PHILOSOPHY
509 Coding standards are deeply personal and highly subjective. The
510 goal of Perl::Critic is to help you write code that conforms with a
511 set of best practices. Our primary goal is not to dictate what
512 those practices are, but rather, to implement the practices
513 discovered by others. Ultimately, you make the rules --
514 Perl::Critic is merely a tool for encouraging consistency. If there
515 is a policy that you think is important or that we have overlooked,
516 we would be very grateful for contributions, or you can simply load
517 your own private set of policies into Perl::Critic.
518
519EXTENDING THE CRITIC
520 The modular design of Perl::Critic is intended to facilitate the
521 addition of new Policies. You'll need to have some understanding of PPI,
522 but most Policy modules are pretty straightforward and only require
523 about 20 lines of code. Please see the Perl::Critic::DEVELOPER file
524 included in this distribution for a step-by-step demonstration of how to
525 create new Policy modules.
526
527 If you develop any new Policy modules, feel free to send them to
528 "thaljef@cpan.org" and I'll be happy to put them into the Perl::Critic
529 distribution. Or if you'd like to work on the Perl::Critic project
530 directly, check out our repository at <http://perlcritic.tigris.org>. To
531 subscribe to our mailing list, send a message to
532 "dev-subscribe@perlcritic.tigris.org".
533
534PREREQUISITES
535 Perl::Critic requires the following modules:
536
537 Config::Tiny
538
539 File::Spec
540
541 IO::String
542
543 List::Util
544
545 List::MoreUtils
546
547 Module::Pluggable
548
549 PPI
550
551 Pod::Usage
552
553 Pod::PlainText
554
555 Scalar::Util
556
557 String::Format
558
559 The following modules are optional, but recommended for complete
560 testing:
561
562 Test::Pod
563
564 Test::Pod::Coverage
565
566BUGS
567 Scrutinizing Perl code is hard for humans, let alone machines. If you
568 find any bugs, particularly false-positives or false-negatives from a
569 Perl::Critic::Policy, please submit them to
570 <http://rt.cpan.org/NoAuth/Bugs.html?Dist=Perl-Critic>. Thanks.
571
572CREDITS
573 Adam Kennedy - For creating PPI, the heart and soul of Perl::Critic.
574
575 Damian Conway - For writing Perl Best Practices, finally :)
576
577 Chris Dolan - For contributing the best features and Policy modules.
578
579 Giuseppe Maxia - For all the great ideas and positive encouragement.
580
ffe5f1a7
JRT
581 Andy Lester - For creating the very first third-party policies.
582
583 Joshua ben Jore - For continued feedback and sanity checking.
584
585 Elliot Shank - For creating one of the coolest Policies.
586
b9e35135
JRT
587 and Sharon, my wife - For putting up with my all-night code sessions.
588
589AUTHOR
590 Jeffrey Ryan Thalhammer <thaljef@cpan.org>
591
592COPYRIGHT
593 Copyright (c) 2005-2006 Jeffrey Ryan Thalhammer. All rights reserved.
594
595 This program is free software; you can redistribute it and/or modify it
596 under the same terms as Perl itself. The full text of this license can
597 be found in the LICENSE file included with this module.
598