X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FC3.pm;h=30e87369235f6591928c967ca1d3d4476a72fb40;hb=cd8d362abdb59c06cacf10c50dffc4551d39cfb2;hp=3fb7b299956caf3cc5440c4dd366ed9151c96a3d;hpb=dd6d58ff776ef3e678c5ac414022c64ad7febc36;p=gitmo%2FClass-C3.git diff --git a/lib/Class/C3.pm b/lib/Class/C3.pm index 3fb7b29..30e8736 100644 --- a/lib/Class/C3.pm +++ b/lib/Class/C3.pm @@ -4,15 +4,13 @@ package Class::C3; use strict; use warnings; -our $VERSION = '0.15_02'; +our $VERSION = '0.15_05'; 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($^V < 5.009005) { eval "require Class::C3::XS"; if($@) { die $@ if $@ !~ /locate/; @@ -116,7 +114,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 +125,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 +152,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}; @@ -253,18 +252,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 +=head1 SPECIAL NOTE FOR 0.15_05 -To try this with the experimental perl core c3 patch, -download a recent copy perl-current: +To try this with the new perl core c3 support, +download the most recent copy perl-current: -http://mirrors.develooper.com/perl/APC/perl-current-snap/perl-current@30943.tar.bz2 - -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_05. =head1 DESCRIPTION