1 |
=head1 NAME |
2 |
|
3 |
common::sense - save a tree AND a kitten, use common::sense! |
4 |
|
5 |
=head1 SYNOPSIS |
6 |
|
7 |
use common::sense; |
8 |
|
9 |
# roughly the same as, with much lower memory usage: |
10 |
# |
11 |
# use strict qw(vars subs); |
12 |
# use feature qw(say state switch); |
13 |
# no warnings; |
14 |
|
15 |
=head1 DESCRIPTION |
16 |
|
17 |
This module implements some sane defaults for Perl programs, as defined by |
18 |
two typical (or not so typical - use your common sense) specimens of |
19 |
Perl coders. |
20 |
|
21 |
=over 4 |
22 |
|
23 |
=item use strict qw(subs vars) |
24 |
|
25 |
Using C<use strict> is definitely common sense, but C<use strict |
26 |
'refs'> definitely overshoots it's usefulness. After almost two |
27 |
decades of Perl hacking, we decided that it does more harm than being |
28 |
useful. Specifically, constructs like these: |
29 |
|
30 |
@{ $var->[0] } |
31 |
|
32 |
Must be written like this, when C<use strict 'refs'> is in scope, and |
33 |
C<$var> can legally be C<undef>: |
34 |
|
35 |
@{ $var->[0] || [] } |
36 |
|
37 |
This is annoying, and doesn't shield against obvious mistakes such as |
38 |
using C<"">, so one would even have to write: |
39 |
|
40 |
@{ defined $var->[0] ? $var->[0] : [] } |
41 |
|
42 |
... which nobody with a bit of common sense would consider |
43 |
writing. Curiously enough, sometimes, perl is not so strict, as this works |
44 |
even with C<use strict> in scope: |
45 |
|
46 |
for (@{ $var->[0] }) { ... |
47 |
|
48 |
If that isnt hipocrasy! And all that from a mere program! |
49 |
|
50 |
=item use feature qw(say state given) |
51 |
|
52 |
We found it annoying that we always have to enable extra features. If |
53 |
something breaks because it didn't anticipate future changes, so be |
54 |
it. 5.10 broke almost all our XS modules and nobody cared either - and few |
55 |
modules that are no longer maintained work with newer versions of Perl, |
56 |
regardless of use feature. |
57 |
|
58 |
If your code isn'talive, it's dead, jim. |
59 |
|
60 |
=item no warnings |
61 |
|
62 |
The dreaded warnings. Even worse, the horribly dreaded C<-w> switch. Even |
63 |
though we don't care if other people use warnings (and certainly there are |
64 |
useful ones), a lot of warnings simply go against the spirit of Perl, most |
65 |
prominently, the warnings related to C<undef>. There is nothing wrong with |
66 |
C<undef>: it has well-defined semantics, it is useful, and spitting out |
67 |
warnings you never asked for is just evil. |
68 |
|
69 |
So every module needs C<no warnings> to avoid somebody accidentally using |
70 |
C<-w> and forcing his bad standards on our code. No will do. |
71 |
|
72 |
(Also, why isn't this a C<use feature> switch? Adding warnings is |
73 |
apparently considered O.K., even if it breaks your programs). |
74 |
|
75 |
=item much less memory |
76 |
|
77 |
Just using all those pragmas together waste <blink>I<< B<776> kilobytes |
78 |
>></blink> of precious memory in my perl, for I<every single perl process |
79 |
using our code>, which on our machines, is a lot. |
80 |
|
81 |
The money/time/effort/electricity invested in these gigabytes (probably |
82 |
petabytes globally!) of wasted memory could easily save 42 trees, and a |
83 |
kitten! |
84 |
|
85 |
=cut |
86 |
|
87 |
package Async::Interrupt; |
88 |
|
89 |
no warnings; |
90 |
|
91 |
BEGIN { |
92 |
$VERSION = '0.03'; |
93 |
|
94 |
require XSLoader; |
95 |
XSLoader::load Async::Interrupt::, $VERSION; |
96 |
} |
97 |
|
98 |
our $DIED = sub { warn "$@" }; |
99 |
|
100 |
=cut |
101 |
|
102 |
1; |
103 |
|
104 |
=back |
105 |
|
106 |
=head1 EXAMPLE |
107 |
|
108 |
There really should be a complete C/XS example. Bug me about it. |
109 |
|
110 |
=head1 IMPLEMENTATION DETAILS AND LIMITATIONS |
111 |
|
112 |
This module works by "hijacking" SIGKILL, which is guaranteed to be always |
113 |
available in perl, but also cannot be caught, so is always available. |
114 |
|
115 |
Basically, this module fakes the receive of a SIGKILL signal and |
116 |
then catches it. This makes normal signal handling slower (probably |
117 |
unmeasurably), but has the advantage of not requiring a special runops nor |
118 |
slowing down normal perl execution a bit. |
119 |
|
120 |
It assumes that C<sig_atomic_t> and C<int> are both exception-safe to |
121 |
modify (C<sig_atomic_> is used by this module, and perl itself uses |
122 |
C<int>, so we can assume that this is quite portable, at least w.r.t. |
123 |
signals). |
124 |
|
125 |
=head1 AUTHOR |
126 |
|
127 |
Marc Lehmann <schmorp@schmorp.de> |
128 |
http://home.schmorp.de/ |
129 |
|
130 |
=cut |
131 |
|