Module::Install, small things
[gitmo/Class-C3.git] / lib / Class / C3.pm
index 9bec670..c5697d2 100644 (file)
@@ -4,28 +4,27 @@ package Class::C3;
 use strict;
 use warnings;
 
-our $VERSION = '0.15_01';
+our $VERSION = '0.15_06';
 
 our $C3_IN_CORE;
 our $C3_XS;
 
 BEGIN {
-    eval "require mro"; # XXX in the future, this should be a version check
-    if($@) {
-        die $@ if $@ !~ /locate/;
+    if($] > 5.009_004) {
+        $C3_IN_CORE = 1;
+    }
+    else {
         eval "require Class::C3::XS";
-        if($@) {
-            die $@ if $@ !~ /locate/;
-            eval "require Algorithm::C3; require Class::C3::next";
-            die $@ if $@;
+        my $error = $@;
+        if(!$error) {
+            $C3_XS = 1;
         }
         else {
-            $C3_XS = 1;
+            die $error if $error !~ /\blocate\b/;
+            require Algorithm::C3;
+            require Class::C3::next;
         }
     }
-    else {
-        $C3_IN_CORE = 1;
-    }
 }
 
 # this is our global stash of both 
@@ -116,7 +115,7 @@ sub _calculate_method_dispatch_table {
     no strict 'refs';
     my @MRO = calculateMRO($class, $merge_cache);
     $MRO{$class} = { MRO => \@MRO };
-    my $has_overload_fallback = 0;
+    my $has_overload_fallback;
     my %methods;
     # NOTE: 
     # we do @MRO[1 .. $#MRO] here because it
@@ -127,7 +126,7 @@ sub _calculate_method_dispatch_table {
         # have use "fallback", then we want to
         # grab that value 
         $has_overload_fallback = ${"${local}::()"} 
-            if defined ${"${local}::()"};
+            if !defined $has_overload_fallback && defined ${"${local}::()"};
         foreach my $method (grep { defined &{"${local}::$_"} } keys %{"${local}::"}) {
             # skip if already overriden in local class
             next unless !defined *{"${class}::$method"}{CODE};
@@ -154,7 +153,8 @@ sub _apply_method_dispatch_table {
     my $class = shift;
     no strict 'refs';
     ${"${class}::()"} = $MRO{$class}->{has_overload_fallback}
-        if $MRO{$class}->{has_overload_fallback};
+        if !defined &{"${class}::()"}
+           && defined $MRO{$class}->{has_overload_fallback};
     foreach my $method (keys %{$MRO{$class}->{methods}}) {
         if ( $method =~ /^\(/ ) {
             my $orig = $MRO{$class}->{methods}->{$method}->{orig};
@@ -168,7 +168,7 @@ sub _remove_method_dispatch_tables {
     return if $C3_IN_CORE;
     foreach my $class (keys %MRO) {
         _remove_method_dispatch_table($class);
-    }       
+    }
 }
 
 sub _remove_method_dispatch_table {
@@ -180,7 +180,7 @@ sub _remove_method_dispatch_table {
         delete ${"${class}::"}{$method}
             if defined *{"${class}::${method}"}{CODE} && 
                (*{"${class}::${method}"}{CODE} eq $MRO{$class}->{methods}->{$method}->{code});       
-    }   
+    }
 }
 
 sub calculateMRO {
@@ -192,6 +192,8 @@ sub calculateMRO {
     }, $merge_cache);
 }
 
+# Method overrides to support 5.9.5+ or Class::C3::XS
+
 sub _core_calculateMRO { @{mro::get_linear_isa($_[0])} }
 
 if($C3_IN_CORE) {
@@ -201,6 +203,8 @@ if($C3_IN_CORE) {
 elsif($C3_XS) {
     no warnings 'redefine';
     *Class::C3::calculateMRO = \&Class::C3::XS::calculateMRO;
+    *Class::C3::_calculate_method_dispatch_table
+        = \&Class::C3::XS::_calculate_method_dispatch_table;
 }
 
 1;
@@ -253,18 +257,16 @@ Class::C3 - A pragma to use the C3 method resolution order algortihm
     D->can('hello')->();          # can() also works correctly
     UNIVERSAL::can('D', 'hello'); # as does UNIVERSAL::can()
 
-=head1 SPECIAL NOTE FOR 0.15_01
-
-To try this with the experimental perl core c3 patch,
-download a recent copy perl-current:
+=head1 SPECIAL NOTE FOR 0.15_06
 
-http://mirrors.develooper.com/perl/APC/perl-current-snap/perl-current@30943.tar.bz2
+To try this with the new perl core c3 support,
+download the most recent copy perl-current:
 
-apply the enclosed c3.patch, and install this perl:
+http://mirrors.develooper.com/perl/APC/perl-current-snap/
 
 sh Configure -Dusedevel -Dprefix=/where/I/want/it -d -e && make && make test && make install
 
-then try your C3-using software against this perl + Class::C3 0.15_01.
+then try your C3-using software against this perl + Class::C3 0.15_06.
 
 =head1 DESCRIPTION
 
@@ -486,7 +488,7 @@ limitation of this module.
 
 =head1 COMPATIBILITY
 
-If your software requires Perl 5.9.5 or higher, you do not need L<Class::C3>, you can simple C<use mro 'c3'>, and not worry about C<initialize()>, avoid some of the above caveats, and get the best possible performance.  See L<mro> for more details.
+If your software requires Perl 5.9.5 or higher, you do not need L<Class::C3>, you can simply C<use mro 'c3'>, and not worry about C<initialize()>, avoid some of the above caveats, and get the best possible performance.  See L<mro> for more details.
 
 If your software is meant to work on earlier Perls, use L<Class::C3> as documented here.  L<Class::C3> will detect Perl 5.9.5+ and take advantage of the core support when available.