use strict;
use warnings;
-our $VERSION = '0.15_04';
+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/;
- eval "require Algorithm::C3; require Class::C3::next";
- die $@ if $@;
+ if(my $error = $@) {
+ die $error if $error !~ /\blocate\b/;
+ require Algorithm::C3;
+ require Class::C3::next;
}
else {
$C3_XS = 1;
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
# 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};
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};
return if $C3_IN_CORE;
foreach my $class (keys %MRO) {
_remove_method_dispatch_table($class);
- }
+ }
}
sub _remove_method_dispatch_table {
delete ${"${class}::"}{$method}
if defined *{"${class}::${method}"}{CODE} &&
(*{"${class}::${method}"}{CODE} eq $MRO{$class}->{methods}->{$method}->{code});
- }
+ }
}
sub calculateMRO {
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;
D->can('hello')->(); # can() also works correctly
UNIVERSAL::can('D', 'hello'); # as does UNIVERSAL::can()
-=head1 SPECIAL NOTE FOR 0.15_04
+=head1 SPECIAL NOTE FOR 0.15_05
-To try this with the experimental perl core c3 patch,
+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/
-Apply the latest C3 patch from:
-
-http://www.dtmf.com/c3-subgen.patch
-
-Then:
-
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_04.
+then try your C3-using software against this perl + Class::C3 0.15_05.
=head1 DESCRIPTION