From: Eric Wilhelm <[EMAIL PROTECTED]>
> I found myself wanting to check whether some code had a $SIG{__DIE__} in
> it and realized I still had this silly module in my experiments
> directory.
>
> This throws an error whenever a $SIG{__DIE__} is assigned without a
> local(). Potentially useful in tests, or just via -M...
>
> (Yes, actually it throws an error when it gets deleted, but the point is
> to catch itself getting replaced.)
>
> That seems like it might be useful on CPAN and I'm not finding anything
> in a search, so it just needs a name? I thought about adding more
> features, but then that would just be feature creep.
>
> Should it be in Devel::?
>
> package Carp::NoSigDie;
>
> <snipped>
>
> Thoughts?
Why not make it slightly more general?
-----------------------------------------
package CarpIfForgotten;
use strict;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(makeSubThatCarpsIfForgotten);
use Carp;
use warnings;
my $ended = 0;
END {$ended = 1;};
sub makeSubThatCarpsIfForgotten {
my ($msg, $behaviour) = @_;
my $obj = {};
my $pkg = 'CarpOnDESTROY' . (0+\$obj);
{ no strict 'refs';
*{$pkg.'::DESTROY'} = sub {
return if $ended;
Carp::carp($msg)
};
}
$obj = bless $obj, $pkg;
if ($behaviour) {
return sub {
my $foo = $obj; # to keep a reference
goto &$behaviour
}
} else {
return sub {
my $foo = $obj; # to keep a reference
return;
}
}
}
1;
-----------------------------------------
# test1.pl
use CarpIfForgotten;
our $sub1 = makeSubThatCarpsIfForgotten( 'sub1 disappeared', sub
{print "sub1 called\n"});
our $sub2 = makeSubThatCarpsIfForgotten( 'sub2 disappeared', sub
{print "sub2 called\n"});
our $sub3 = makeSubThatCarpsIfForgotten( 'sub3 disappeared');
print "All set\n";
$sub1->();
$sub2->();
$sub3->();
print "All called\n";
undef $sub2;
print "Sub1 destroyed\n";
sleep(1);
$sub1->();
$sub3->();
print "Others called\n";
-----------------------------------------
# test2.pl
use CarpIfForgotten;
$SIG{__DIE__} = makeSubThatCarpsIfForgotten('someone changed the
__DIE__ handler!');
print "Set\n";
$SIG{__DIE__} = undef;
print "ReSet\n";
-----------------------------------------
There's a catch though ... if the $subN variables are 'my' instead of
'our' they are destroyed before the END{} block runs! Also if the
'$SIG{__DIE__} = undef;' is the last statement that runs, you are not
warned.
Before uploading to CPAN I'd allow specifying a subroutine to call in
place of the message that is to be carp()ed.
Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed
to get drunk and croon as much as they like.
-- Terry Pratchett in Sourcery