Version 0.12
[p5sagit/Devel-GlobalDestruction.git] / lib / Devel / GlobalDestruction.pm
index cbfd5aa..092eb21 100644 (file)
@@ -1,36 +1,49 @@
-#!/usr/bin/perl
-
 package Devel::GlobalDestruction;
 
 use strict;
 use warnings;
 
-use XSLoader;
-
-our $VERSION = '0.04';
+our $VERSION = '0.12';
 
-use Sub::Exporter -setup => {
-    exports => [ qw(in_global_destruction) ],
-    groups  => { default => [ -all ] },
+use Sub::Exporter::Progressive -setup => {
+  exports => [ qw(in_global_destruction) ],
+  groups  => { default => [ -all ] },
 };
 
+# we run 5.14+ - everything is in core
+#
 if (defined ${^GLOBAL_PHASE}) {
-    eval 'sub in_global_destruction () { ${^GLOBAL_PHASE} eq q[DESTRUCT] }';
+  eval 'sub in_global_destruction () { ${^GLOBAL_PHASE} eq q[DESTRUCT] }; 1'
+    or die $@;
+}
+# try to load the xs version if it was compiled
+#
+elsif (eval {
+  require Devel::GlobalDestruction::XS;
+  no warnings 'once';
+  *in_global_destruction = \&Devel::GlobalDestruction::XS::in_global_destruction;
+  1;
+}) {
+  # the eval already installed everything, nothing to do
 }
 else {
-    XSLoader::load(__PACKAGE__, $VERSION);
+  # internally, PL_main_cv is set to Nullcv immediately before entering
+  # global destruction and we can use B to detect that.  B::main_cv will
+  # only ever be a B::CV or a B::SPECIAL that is a reference to 0
+  require B;
+  eval 'sub in_global_destruction () { ${B::main_cv()} == 0 }; 1'
+    or die $@;
 }
 
-__PACKAGE__
+1;  # keep require happy
 
-__END__
 
-=pod
+__END__
 
 =head1 NAME
 
-Devel::GlobalDestruction - Expose the flag which marks global
-destruction.
+Devel::GlobalDestruction - Provides function returning the equivalent of
+C<${^GLOBAL_PHASE} eq 'DESTRUCT'> for older perls.
 
 =head1 SYNOPSIS
 
@@ -51,7 +64,7 @@ Perl's global destruction is a little tricky to deal with WRT finalizers
 because it's not ordered and objects can sometimes disappear.
 
 Writing defensive destructors is hard and annoying, and usually if global
-destruction is happenning you only need the destructors that free up non
+destruction is happening you only need the destructors that free up non
 process local resources to actually execute.
 
 For these constructors you can avoid the mess by simply bailing out if global
@@ -59,24 +72,19 @@ destruction is in effect.
 
 =head1 EXPORTS
 
-This module uses L<Sub::Exporter> so the exports may be renamed, aliased, etc.
+This module uses L<Sub::Exporter::Progressive> so the exports may be renamed,
+aliased, etc. if L<Sub::Exporter> is present.
 
 =over 4
 
 =item in_global_destruction
 
 Returns true if the interpreter is in global destruction. In perl 5.14+, this
-returns C<${^GLOBAL_PHASE} eq 'DESTRUCT'>, and on earlier perls, it returns the
-current value of C<PL_dirty>.
+returns C<${^GLOBAL_PHASE} eq 'DESTRUCT'>, and on earlier perls, detects it using
+the value of C<PL_main_cv> or C<PL_dirty>.
 
 =back
 
-=head1 VERSION CONTROL
-
-This module is maintained using Darcs. You can get the latest version from
-L<http://nothingmuch.woobling.org/code>, and use C<darcs send> to commit
-changes.
-
 =head1 AUTHORS
 
 Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
@@ -85,6 +93,14 @@ Florian Ragwitz E<lt>rafl@debian.orgE<gt>
 
 Jesse Luehrs E<lt>doy@tozt.netE<gt>
 
+Peter Rabbitson E<lt>ribasushi@cpan.orgE<gt>
+
+Arthur Axel 'fREW' Schmidt E<lt>frioux@gmail.comE<gt>
+
+Elizabeth Mattijsen E<lt>liz@dijkmat.nlE<gt>
+
+Greham Knop E<lt>haarg@haarg.orgE<gt>
+
 =head1 COPYRIGHT
 
     Copyright (c) 2008 Yuval Kogman. All rights reserved
@@ -92,5 +108,3 @@ Jesse Luehrs E<lt>doy@tozt.netE<gt>
     it and/or modify it under the same terms as Perl itself.
 
 =cut
-
-