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