Version 0.12
[p5sagit/Devel-GlobalDestruction.git] / lib / Devel / GlobalDestruction.pm
index 901f1ad..092eb21 100644 (file)
@@ -1,56 +1,62 @@
-#!/usr/bin/perl
-
 package Devel::GlobalDestruction;
 
 use strict;
 use warnings;
 
-use vars qw($VERSION @ISA);
-
-BEGIN {
-       $VERSION = '0.02';
+our $VERSION = '0.12';
 
-       local $@;
+use Sub::Exporter::Progressive -setup => {
+  exports => [ qw(in_global_destruction) ],
+  groups  => { default => [ -all ] },
+};
 
-       eval {
-               require XSLoader;
-               __PACKAGE__->XSLoader::load($VERSION);
-               1;
-       } or do {
-               require DynaLoader;
-               push @ISA, 'DynaLoader';
-               __PACKAGE__->bootstrap($VERSION);
-       };
+# we run 5.14+ - everything is in core
+#
+if (defined ${^GLOBAL_PHASE}) {
+  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 {
+  # 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 $@;
 }
 
-use Sub::Exporter -setup => {
-       exports => [ qw(in_global_destruction) ],
-       groups  => { default => [ -all ] },
-};
+1;  # keep require happy
 
-__PACKAGE__
 
 __END__
 
-=pod
-
 =head1 NAME
 
-Devel::GlobalDestruction - Expose PL_dirty, the flag which marks global
-destruction.
+Devel::GlobalDestruction - Provides function returning the equivalent of
+C<${^GLOBAL_PHASE} eq 'DESTRUCT'> for older perls.
 
 =head1 SYNOPSIS
 
-       package Foo;
-       use Devel::GlobalDestruction;
+    package Foo;
+    use Devel::GlobalDestruction;
 
-       use namespace::clean; # to avoid having an "in_global_destruction" method
+    use namespace::clean; # to avoid having an "in_global_destruction" method
 
-       sub DESTROY {
-               return if in_global_destruction;
+    sub DESTROY {
+        return if in_global_destruction;
 
-               do_something_a_little_tricky();
-       }
+        do_something_a_little_tricky();
+    }
 
 =head1 DESCRIPTION
 
@@ -58,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
@@ -66,32 +72,39 @@ 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 the current value of C<PL_dirty>.
+Returns true if the interpreter is in global destruction. In perl 5.14+, this
+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
+=head1 AUTHORS
 
-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.
+Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
 
-=head1 AUTHOR
+Florian Ragwitz E<lt>rafl@debian.orgE<gt>
 
-Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
+Jesse Luehrs E<lt>doy@tozt.netE<gt>
 
-=head1 COPYRIGHT
+Peter Rabbitson E<lt>ribasushi@cpan.orgE<gt>
 
-       Copyright (c) 2008 Yuval Kogman. All rights reserved
-       This program is free software; you can redistribute
-       it and/or modify it under the same terms as Perl itself.
+Arthur Axel 'fREW' Schmidt E<lt>frioux@gmail.comE<gt>
 
-=cut
+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
+    This program is free software; you can redistribute
+    it and/or modify it under the same terms as Perl itself.
+
+=cut