X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FC3.pm;h=793c1824f71aa712bafe302b8fb0295941351d4c;hb=ff5d5837313d7af9df1f3892e1340fe094beced5;hp=0b8c826eb2f214556b52339d5a778408b00191ba;hpb=43dddf88d67a09bbbf90b8dece34d8c052fd09ef;p=gitmo%2FClass-C3.git diff --git a/lib/Class/C3.pm b/lib/Class/C3.pm index 0b8c826..793c182 100644 --- a/lib/Class/C3.pm +++ b/lib/Class/C3.pm @@ -4,20 +4,24 @@ package Class::C3; use strict; use warnings; -our $VERSION = '0.15_01'; +our $VERSION = '0.15_04'; 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/; -# eval "require Class::C3::XS"; -# if($@) { -# die $@ if $@ !~ /locate/; + eval "require Class::C3::XS"; + if($@) { + die $@ if $@ !~ /locate/; eval "require Algorithm::C3; require Class::C3::next"; die $@ if $@; -# } + } + else { + $C3_XS = 1; + } } else { $C3_IN_CORE = 1; @@ -182,14 +186,23 @@ sub _remove_method_dispatch_table { sub calculateMRO { my ($class, $merge_cache) = @_; - return @{mro::get_linear_isa($class)} if $C3_IN_CORE; - return Algorithm::C3::merge($class, sub { no strict 'refs'; @{$_[0] . '::ISA'}; }, $merge_cache); } +sub _core_calculateMRO { @{mro::get_linear_isa($_[0])} } + +if($C3_IN_CORE) { + no warnings 'redefine'; + *Class::C3::calculateMRO = \&_core_calculateMRO; +} +elsif($C3_XS) { + no warnings 'redefine'; + *Class::C3::calculateMRO = \&Class::C3::XS::calculateMRO; +} + 1; __END__ @@ -240,18 +253,22 @@ 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_04 To try this with the experimental perl core c3 patch, -download a recent copy perl-current: +download the most recent copy perl-current: -http://mirrors.develooper.com/perl/APC/perl-current-snap/perl-current@30943.tar.bz2 +http://mirrors.develooper.com/perl/APC/perl-current-snap/ -apply the enclosed c3.patch, and install this perl: +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_01. +then try your C3-using software against this perl + Class::C3 0.15_04. =head1 DESCRIPTION @@ -471,6 +488,16 @@ limitation of this module. =back +=head1 COMPATIBILITY + +If your software requires Perl 5.9.5 or higher, you do not need L, you can simple C, and not worry about C, avoid some of the above caveats, and get the best possible performance. See L for more details. + +If your software is meant to work on earlier Perls, use L as documented here. L will detect Perl 5.9.5+ and take advantage of the core support when available. + +=head1 Class::C3::XS + +This module will load L if it's installed and you are running on a Perl version older than 5.9.5. Installing this is recommended when possible, as it results in significant performance improvements (but unlike the 5.9.5+ core support, it still has all of the same caveats as L). + =head1 CODE COVERAGE I use B to test the code coverage of my tests, below is the B report on this