reformat docs
[p5sagit/strictures.git] / lib / strictures.pm
CommitLineData
394c3a46 1package strictures;
2
3use strict;
4use warnings FATAL => 'all';
5
500f28df 6BEGIN {
7 *_PERL_LT_5_8_4 = ($] < 5.008004) ? sub(){1} : sub(){0};
8}
084caaf3 9
9668cbf1 10our $VERSION = '1.005006';
20b853bb 11$VERSION = eval $VERSION;
394c3a46 12
13sub VERSION {
91b5f6b6 14 my ($class, $version) = @_;
15 for ($version) {
394c3a46 16 last unless defined && !ref && int != 1;
17 die "Major version specified as $_ - this is strictures version 1";
18 }
91b5f6b6 19 # passing undef here may either warn or die depending on the version of perl.
20 # we can't match the caller's warning state in this case, so just disable the
21 # warning.
0925b84b 22 no warnings 'uninitialized';
394c3a46 23 shift->SUPER::VERSION(@_);
24}
25
a91e95ab 26our $extra_load_states;
ffedb166 27
2da53f4a 28our $Smells_Like_VCS;
12b8f19b 29
394c3a46 30sub import {
31 strict->import;
32 warnings->import(FATAL => 'all');
084caaf3 33
653f4377 34 my $extra_tests = do {
394c3a46 35 if (exists $ENV{PERL_STRICTURES_EXTRA}) {
084caaf3 36 if (_PERL_LT_5_8_4 and $ENV{PERL_STRICTURES_EXTRA}) {
0f96deac 37 die 'PERL_STRICTURES_EXTRA checks are not available on perls older than 5.8.4: '
084caaf3 38 . "please unset \$ENV{PERL_STRICTURES_EXTRA}\n";
39 }
40 $ENV{PERL_STRICTURES_EXTRA};
85ba5ac7 41 } elsif (! _PERL_LT_5_8_4) {
2da53f4a 42 (caller)[1] =~ /^(?:t|xt|lib|blib)[\\\/]/
43 and defined $Smells_Like_VCS ? $Smells_Like_VCS
85ba5ac7 44 : ( $Smells_Like_VCS = !!(
2da53f4a 45 -e '.git' || -e '.svn' || -e '.hg'
46 || (-e '../../dist.ini'
47 && (-e '../../.git' || -e '../../.svn' || -e '../../.hg' ))
48 ))
394c3a46 49 }
50 };
653f4377 51 if ($extra_tests) {
4f219885 52 $extra_load_states ||= do {
53
54 my (%rv, @failed);
488f2966 55 foreach my $mod (qw(indirect multidimensional bareword::filehandles)) {
4f219885 56 eval "require $mod; \$rv{'$mod'} = 1;" or do {
57 push @failed, $mod;
58
59 # courtesy of the 5.8 require bug
488f2966 60 # (we do a copy because 5.16.2 at least uses the same read-only
61 # scalars for the qw() list and it doesn't seem worth a $^V check)
62
63 (my $file = $mod) =~ s|::|/|g;
64 delete $INC{"${file}.pm"};
4f219885 65 };
66 }
67
68 if (@failed) {
69 my $failed = join ' ', @failed;
70 print STDERR <<EOE;
ffedb166 71strictures.pm extra testing active but couldn't load all modules. Missing were:
72
73 $failed
74
0925b84b 75Extra testing is auto-enabled in checkouts only, so if you're the author
624cf8bb 76of a strictures-using module you need to run:
653f4377 77
78 cpan indirect multidimensional bareword::filehandles
79
80but these modules are not required by your users.
084caaf3 81EOE
4f219885 82 }
83
84 \%rv;
85 };
86
87 indirect->unimport(':fatal') if $extra_load_states->{indirect};
88 multidimensional->unimport if $extra_load_states->{multidimensional};
89 bareword::filehandles->unimport if $extra_load_states->{'bareword::filehandles'};
394c3a46 90 }
91}
92
931;
94
95__END__
96=head1 NAME
97
98strictures - turn on strict and make all warnings fatal
99
100=head1 SYNOPSIS
101
102 use strictures 1;
103
104is equivalent to
105
106 use strict;
107 use warnings FATAL => 'all';
108
5ab06a4d 109except when called from a file which matches:
394c3a46 110
5b2a026b 111 (caller)[1] =~ /^(?:t|xt|lib|blib)[\\\/]/
394c3a46 112
3e14202f 113and when either C<.git>, C<.svn>, or C<.hg> is present in the current directory
114(with the intention of only forcing extra tests on the author side) -- or when
115C<.git>, C<.svn>, or C<.hg> is present two directories up along with
116C<dist.ini> (which would indicate we are in a C<dzil test> operation, via
117L<Dist::Zilla>) -- or when the C<PERL_STRICTURES_EXTRA> environment variable is
118set, in which case
394c3a46 119
120 use strictures 1;
121
122is equivalent to
123
124 use strict;
125 use warnings FATAL => 'all';
126 no indirect 'fatal';
653f4377 127 no multidimensional;
128 no bareword::filehandles;
394c3a46 129
3e14202f 130Note that C<PERL_STRICTURES_EXTRA> may at some point add even more tests, with
131only a minor version increase, but any changes to the effect of C<use
132strictures> in normal mode will involve a major version bump.
394c3a46 133
0eb0d037 134If any of the extra testing modules are not present, L<strictures> will
25877bf2 135complain loudly, once, via C<warn()>, and then shut up. But you really
ffedb166 136should consider installing them, they're all great anti-footgun tools.
17b03f2e 137
394c3a46 138=head1 DESCRIPTION
139
140I've been writing the equivalent of this module at the top of my code for
141about a year now. I figured it was time to make it shorter.
142
25877bf2 143Things like the importer in C<use Moose> don't help me because they turn
d8c1c6b2 144warnings on but don't make them fatal -- which from my point of view is
2288278f 145useless because I want an exception to tell me my code isn't warnings-clean.
394c3a46 146
147Any time I see a warning from my code, that indicates a mistake.
148
d8c1c6b2 149Any time my code encounters a mistake, I want a crash -- not spew to STDERR
394c3a46 150and then unknown (and probably undesired) subsequent behaviour.
151
152I also want to ensure that obvious coding mistakes, like indirect object
153syntax (and not so obvious mistakes that cause things to accidentally compile
154as such) get caught, but not at the cost of an XS dependency and not at the
155cost of blowing things up on another machine.
156
0eb0d037 157Therefore, L<strictures> turns on additional checking, but only when it thinks
2288278f 158it's running in a test file in a VCS checkout -- although if this causes
93ae637e 159undesired behaviour this can be overridden by setting the
25877bf2 160C<PERL_STRICTURES_EXTRA> environment variable.
394c3a46 161
162If additional useful author side checks come to mind, I'll add them to the
3e14202f 163C<PERL_STRICTURES_EXTRA> code path only -- this will result in a minor version
164increase (e.g. 1.000000 to 1.001000 (1.1.0) or similar). Any fixes only to the
165mechanism of this code will result in a sub-version increase (e.g. 1.000000 to
1661.000001 (1.0.1)).
394c3a46 167
25877bf2 168If the behaviour of C<use strictures> in normal mode changes in any way, that
d8c1c6b2 169will constitute a major version increase -- and the code already checks
394c3a46 170when its version is tested to ensure that
171
172 use strictures 1;
173
174will continue to only introduce the current set of strictures even if 2.0 is
175installed.
eae006ee 176
177=head1 METHODS
178
179=head2 import
180
181This method does the setup work described above in L</DESCRIPTION>
182
183=head2 VERSION
184
25877bf2 185This method traps the C<< strictures->VERSION(1) >> call produced by a use line
eae006ee 186with a version number on it and does the version check.
187
f9df7e2e 188=head1 EXTRA TESTING RATIONALE
189
25877bf2 190Every so often, somebody complains that they're deploying via C<git pull>
d8c1c6b2 191and that they don't want L<strictures> to enable itself in this case -- and that
f9df7e2e 192setting C<PERL_STRICTURES_EXTRA> to 0 isn't acceptable (additional ways to
193disable extra testing would be welcome but the discussion never seems to get
194that far).
195
196In order to allow us to skip a couple of stages and get straight to a
197productive conversation, here's my current rationale for turning the
198extra testing on via a heuristic:
199
200The extra testing is all stuff that only ever blows up at compile time;
2288278f 201this is intentional. So the oft-raised concern that it's different code being
d8c1c6b2 202tested is only sort of the case -- none of the modules involved affect the
f9df7e2e 203final optree to my knowledge, so the author gets some additional compile
204time crashes which he/she then fixes, and the rest of the testing is
205completely valid for all environments.
206
d8c1c6b2 207The point of the extra testing -- especially C<no indirect> -- is to catch
f9df7e2e 208mistakes that newbie users won't even realise are mistakes without
209help. For example,
210
211 foo { ... };
212
d8c1c6b2 213where foo is an & prototyped sub that you forgot to import -- this is
9a363fed 214pernicious to track down since all I<seems> fine until it gets called
f9df7e2e 215and you get a crash. Worse still, you can fail to have imported it due
216to a circular require, at which point you have a load order dependent
9a363fed 217bug which I've seen before now I<only> show up in production due to tiny
f9df7e2e 218differences between the production and the development environment. I wrote
219L<http://shadow.cat/blog/matt-s-trout/indirect-but-still-fatal/> to explain
220this particular problem before L<strictures> itself existed.
221
2288278f 222As such, in my experience so far L<strictures>' extra testing has
9a363fed 223I<avoided> production versus development differences, not caused them.
f9df7e2e 224
0eb0d037 225Additionally, L<strictures>' policy is very much "try and provide as much
d8c1c6b2 226protection as possible for newbies -- who won't think about whether there's
227an option to turn on or not" -- so having only the environment variable
f9df7e2e 228is not sufficient to achieve that (I get to explain that you need to add
d8c1c6b2 229C<use strict> at least once a week on freenode #perl -- newbies sometimes
f9df7e2e 230completely skip steps because they don't understand that that step
231is important).
232
d8c1c6b2 233I make no claims that the heuristic is perfect -- it's already been evolved
f9df7e2e 234significantly over time, especially for 1.004 where we changed things to
0eb0d037 235ensure it only fires on files in your checkout (rather than L<strictures>-using
f9df7e2e 236modules you happened to have installed, which was just silly). However, I
237hope the above clarifies why a heuristic approach is not only necessary but
3e14202f 238desirable from a point of view of providing new users with as much safety as
239possible, and will allow any future discussion on the subject to focus on "how
240do we minimise annoyance to people deploying from checkouts intentionally".
f9df7e2e 241
96c8649b 242=head1 SEE ALSO
243
244=over 4
245
246=item *
247
248L<indirect>
249
250=item *
251
252L<multidimensional>
253
254=item *
255
256L<bareword::filehandles>
257
258=back
259
eae006ee 260=head1 COMMUNITY AND SUPPORT
261
262=head2 IRC channel
263
264irc.perl.org #toolchain
265
266(or bug 'mst' in query on there or freenode)
267
268=head2 Git repository
269
270Gitweb is on http://git.shadowcat.co.uk/ and the clone URL is:
271
272 git clone git://git.shadowcat.co.uk/p5sagit/strictures.git
273
91be28bc 274The web interface to the repository is at:
275
276 http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/strictures.git
277
eae006ee 278=head1 AUTHOR
279
d81f898d 280mst - Matt S. Trout (cpan:MSTROUT) <mst@shadowcat.co.uk>
eae006ee 281
282=head1 CONTRIBUTORS
283
8190ff5b 284Karen Etheridge (cpan:ETHER) <ether@cpan.org>
eae006ee 285
04b4a35d 286Mithaldu - Christian Walde (cpan:MITHALDU) <walde.christian@gmail.com>
287
a79d1096 288haarg - Graham Knop (cpan:HAARG) <haarg@haarg.org>
289
eae006ee 290=head1 COPYRIGHT
291
292Copyright (c) 2010 the strictures L</AUTHOR> and L</CONTRIBUTORS>
293as listed above.
294
295=head1 LICENSE
296
297This library is free software and may be distributed under the same terms
298as perl itself.
299
300=cut