ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/common-sense/sense.pm
Revision: 1.1
Committed: Thu Jul 9 16:14:16 2009 UTC (14 years, 10 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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