4 use warnings FATAL => 'all';
7 *_PERL_LT_5_8_4 = ("$]" < 5.008004) ? sub(){1} : sub(){0};
8 # goto &UNIVERSAL::VERSION usually works on 5.8, but fails on some ARM
9 # machines. Seems to always work on 5.10 though.
10 *_CAN_GOTO_VERSION = ("$]" >= 5.010000) ? sub(){1} : sub(){0};
13 our $VERSION = '2.000006';
16 our @WARNING_CATEGORIES = grep { exists $warnings::Offsets{$_} } qw(
20 deprecated::apostrophe_as_package_separator
21 deprecated::delimiter_will_be_paired
22 deprecated::dot_in_inc
23 deprecated::goto_construct
24 deprecated::missing_import_called_with_args
25 deprecated::smartmatch
26 deprecated::subsequent_use_version
27 deprecated::unicode_property_name
28 deprecated::version_downgrade
31 experimental::alpha_assertions
32 experimental::args_array_with_signatures
33 experimental::autoderef
37 experimental::const_attr
38 experimental::declared_refs
40 experimental::extra_paired_delimiters
41 experimental::for_list
43 experimental::lexical_subs
44 experimental::lexical_topic
45 experimental::postderef
46 experimental::private_use
47 experimental::re_strict
48 experimental::refaliasing
49 experimental::regex_sets
50 experimental::script_run
51 experimental::signatures
52 experimental::smartmatch
54 experimental::uniprop_wildcards
56 experimental::win32_perlio
119 if (defined $_[1] && eval { &UNIVERSAL::VERSION; 1}) {
121 unless _PERL_LT_5_8_4;
122 $^H{strictures_enable} = int $_[1];
125 _CAN_GOTO_VERSION ? goto &UNIVERSAL::VERSION : &UNIVERSAL::VERSION;
128 our %extra_load_states;
130 our $Smells_Like_VCS;
134 my %opts = @_ == 1 ? %{$_[0]} : @_;
135 if (!exists $opts{version}) {
137 = exists $^H{strictures_enable} ? delete $^H{strictures_enable}
140 $opts{file} = (caller)[1];
141 $class->_enable(\%opts);
145 my ($class, $opts) = @_;
146 my $version = $opts->{version};
148 if !defined $version;
149 my $method = "_enable_$version";
150 if (!$class->can($method)) {
152 Carp::croak("Major version specified as $version - not supported!");
154 $class->$method($opts);
158 my ($class, $opts) = @_;
160 warnings->import(FATAL => 'all');
162 if (_want_extra($opts->{file})) {
163 _load_extras(qw(indirect multidimensional bareword::filehandles));
164 indirect->unimport(':fatal')
165 if $extra_load_states{indirect};
166 multidimensional->unimport
167 if $extra_load_states{multidimensional};
168 bareword::filehandles->unimport
169 if $extra_load_states{'bareword::filehandles'};
173 our @V2_NONFATAL = grep { exists $warnings::Offsets{$_} } (
174 'exec', # not safe to catch
175 'recursion', # will be caught by other mechanisms
176 'internal', # not safe to catch
177 'malloc', # not safe to catch
178 'newline', # stat on nonexistent file with a newline in it
179 'experimental', # no reason for these to be fatal
180 'deprecated', # unfortunately can't make these fatal
181 'portable', # everything worked fine here, just may not elsewhere
183 our @V2_DISABLE = grep { exists $warnings::Offsets{$_} } (
184 'once' # triggers inconsistently, can't be fatalized
188 my ($class, $opts) = @_;
191 warnings->import(FATAL => @WARNING_CATEGORIES);
192 warnings->unimport(FATAL => @V2_NONFATAL);
193 warnings->import(@V2_NONFATAL);
194 warnings->unimport(@V2_DISABLE);
196 if (_want_extra($opts->{file})) {
197 _load_extras(qw(indirect multidimensional bareword::filehandles));
198 indirect->unimport(':fatal')
199 if $extra_load_states{indirect};
200 multidimensional->unimport
201 if $extra_load_states{multidimensional};
202 bareword::filehandles->unimport
203 if $extra_load_states{'bareword::filehandles'};
207 sub _want_extra_env {
208 if (exists $ENV{PERL_STRICTURES_EXTRA}) {
209 if (_PERL_LT_5_8_4 and $ENV{PERL_STRICTURES_EXTRA}) {
210 die 'PERL_STRICTURES_EXTRA checks are not available on perls older'
211 . "than 5.8.4: please unset \$ENV{PERL_STRICTURES_EXTRA}\n";
213 return $ENV{PERL_STRICTURES_EXTRA} ? 1 : 0;
220 my $want_env = _want_extra_env();
222 if defined $want_env;
225 and $file =~ /^(?:t|xt|lib|blib)[\\\/]/
226 and defined $Smells_Like_VCS ? $Smells_Like_VCS
227 : ( $Smells_Like_VCS = !!(
228 -e '.git' || -e '.svn' || -e '.hg' || -e '.bzr'
229 || (-e '../../dist.ini'
230 && (-e '../../.git' || -e '../../.svn' || -e '../../.hg' || -e '../../.bzr' ))
238 foreach my $mod (@extras) {
240 if exists $extra_load_states{$mod};
242 $extra_load_states{$mod} = eval "require $mod; 1;" or do {
245 #work around 5.8 require bug
246 (my $file = $mod) =~ s|::|/|g;
247 delete $INC{"${file}.pm"};
252 my $failed = join ' ', @failed;
253 my $extras = join ' ', @extras;
255 strictures.pm extra testing active but couldn't load all modules. Missing were:
259 Extra testing is auto-enabled in checkouts only, so if you're the author
260 of a strictures-using module you need to run:
264 but these modules are not required by your users.
274 strictures - Turn on strict and make most warnings fatal
283 use warnings FATAL => 'all';
284 use warnings NONFATAL => qw(
296 except when called from a file which matches:
298 (caller)[1] =~ /^(?:t|xt|lib|blib)[\\\/]/
300 and when either C<.git>, C<.svn>, C<.hg>, or C<.bzr> is present in the current
301 directory (with the intention of only forcing extra tests on the author side)
302 -- or when C<.git>, C<.svn>, C<.hg>, or C<.bzr> is present two directories up
303 along with C<dist.ini> (which would indicate we are in a C<dzil test> operation,
304 via L<Dist::Zilla>) -- or when the C<PERL_STRICTURES_EXTRA> environment variable
305 is set, in which case it also does the equivalent of
309 no bareword::filehandles;
311 Note that C<PERL_STRICTURES_EXTRA> may at some point add even more tests, with
312 only a minor version increase, but any changes to the effect of C<use
313 strictures> in normal mode will involve a major version bump.
315 If any of the extra testing modules are not present, L<strictures> will
316 complain loudly, once, via C<warn()>, and then shut up. But you really
317 should consider installing them, they're all great anti-footgun tools.
321 I've been writing the equivalent of this module at the top of my code for
322 about a year now. I figured it was time to make it shorter.
324 Things like the importer in C<use Moose> don't help me because they turn
325 warnings on but don't make them fatal -- which from my point of view is
326 useless because I want an exception to tell me my code isn't warnings-clean.
328 Any time I see a warning from my code, that indicates a mistake.
330 Any time my code encounters a mistake, I want a crash -- not spew to STDERR
331 and then unknown (and probably undesired) subsequent behaviour.
333 I also want to ensure that obvious coding mistakes, like indirect object
334 syntax (and not so obvious mistakes that cause things to accidentally compile
335 as such) get caught, but not at the cost of an XS dependency and not at the
336 cost of blowing things up on another machine.
338 Therefore, L<strictures> turns on additional checking, but only when it thinks
339 it's running in a test file in a VCS checkout -- although if this causes
340 undesired behaviour this can be overridden by setting the
341 C<PERL_STRICTURES_EXTRA> environment variable.
343 If additional useful author side checks come to mind, I'll add them to the
344 C<PERL_STRICTURES_EXTRA> code path only -- this will result in a minor version
345 increase (e.g. 1.000000 to 1.001000 (1.1.0) or similar). Any fixes only to the
346 mechanism of this code will result in a sub-version increase (e.g. 1.000000 to
349 =head1 CATEGORY SELECTIONS
351 strictures does not enable fatal warnings for all categories.
357 Includes a warning that can cause your program to continue running
358 unintentionally after an internal fork. Not safe to fatalize.
362 Infinite recursion will end up overflowing the stack eventually anyway.
366 Triggers deep within perl, in places that are not safe to trap.
370 Triggers deep within perl, in places that are not safe to trap.
374 Includes a warning for using stat on a valid but suspect filename, ending in a
379 Experimental features are used intentionally.
383 Deprecations will inherently be added to in the future in unexpected ways,
384 so making them fatal won't be reliable.
388 Doesn't indicate an actual problem with the program, only that it may not
389 behave properly if run on a different machine.
393 Can't be fatalized. Also triggers very inconsistently, so we just disable it.
399 Depending on the version of strictures requested, different warnings will be
400 enabled. If no specific version is requested, the current version's behavior
401 will be used. Versions can be requested using perl's standard mechanism:
405 Or, by passing in a C<version> option:
407 use strictures version => 2;
414 use warnings FATAL => 'all';
415 use warnings NONFATAL => qw(
427 # and if in dev mode:
430 no bareword::filehandles;
432 Additionally, any warnings created by modules using L<warnings::register> or
433 C<warnings::register_categories()> will not be fatalized.
440 use warnings FATAL => 'all';
441 # and if in dev mode:
444 no bareword::filehandles;
450 This method does the setup work described above in L</DESCRIPTION>. Optionally
451 accepts a C<version> option to request a specific version's behavior.
455 This method traps the C<< strictures->VERSION(1) >> call produced by a use line
456 with a version number on it and does the version check.
458 =head1 EXTRA TESTING RATIONALE
460 Every so often, somebody complains that they're deploying via C<git pull>
461 and that they don't want L<strictures> to enable itself in this case -- and that
462 setting C<PERL_STRICTURES_EXTRA> to 0 isn't acceptable (additional ways to
463 disable extra testing would be welcome but the discussion never seems to get
466 In order to allow us to skip a couple of stages and get straight to a
467 productive conversation, here's my current rationale for turning the
468 extra testing on via a heuristic:
470 The extra testing is all stuff that only ever blows up at compile time;
471 this is intentional. So the oft-raised concern that it's different code being
472 tested is only sort of the case -- none of the modules involved affect the
473 final optree to my knowledge, so the author gets some additional compile
474 time crashes which he/she then fixes, and the rest of the testing is
475 completely valid for all environments.
477 The point of the extra testing -- especially C<no indirect> -- is to catch
478 mistakes that newbie users won't even realise are mistakes without
483 where foo is an & prototyped sub that you forgot to import -- this is
484 pernicious to track down since all I<seems> fine until it gets called
485 and you get a crash. Worse still, you can fail to have imported it due
486 to a circular require, at which point you have a load order dependent
487 bug which I've seen before now I<only> show up in production due to tiny
488 differences between the production and the development environment. I wrote
489 L<http://shadow.cat/blog/matt-s-trout/indirect-but-still-fatal/> to explain
490 this particular problem before L<strictures> itself existed.
492 As such, in my experience so far L<strictures>' extra testing has
493 I<avoided> production versus development differences, not caused them.
495 Additionally, L<strictures>' policy is very much "try and provide as much
496 protection as possible for newbies -- who won't think about whether there's
497 an option to turn on or not" -- so having only the environment variable
498 is not sufficient to achieve that (I get to explain that you need to add
499 C<use strict> at least once a week on freenode #perl -- newbies sometimes
500 completely skip steps because they don't understand that that step
503 I make no claims that the heuristic is perfect -- it's already been evolved
504 significantly over time, especially for 1.004 where we changed things to
505 ensure it only fires on files in your checkout (rather than L<strictures>-using
506 modules you happened to have installed, which was just silly). However, I
507 hope the above clarifies why a heuristic approach is not only necessary but
508 desirable from a point of view of providing new users with as much safety as
509 possible, and will allow any future discussion on the subject to focus on "how
510 do we minimise annoyance to people deploying from checkouts intentionally".
526 L<bareword::filehandles>
530 =head1 COMMUNITY AND SUPPORT
534 irc.perl.org #toolchain
536 (or bug 'mst' in query on there or freenode)
538 =head2 Git repository
540 Gitweb is on http://git.shadowcat.co.uk/ and the clone URL is:
542 git clone git://git.shadowcat.co.uk/p5sagit/strictures.git
544 The web interface to the repository is at:
546 http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/strictures.git
550 mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
554 Karen Etheridge (cpan:ETHER) <ether@cpan.org>
556 Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@gmail.com>
558 haarg - Graham Knop (cpan:HAARG) <haarg@haarg.org>
562 Copyright (c) 2010 the strictures L</AUTHOR> and L</CONTRIBUTORS>
567 This library is free software and may be distributed under the same terms