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