From: Brandon L Black <blblack@gmail.com> Date: Sun, 15 Apr 2007 17:11:14 +0000 (+0000) Subject: Class::C3::XS support X-Git-Tag: 0.16~1^2~8 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0a4d4e25e3b7491155684020f7eabc0293769736;p=gitmo%2FClass-C3.git Class::C3::XS support --- diff --git a/Build.PL b/Build.PL index d5d1b7e..8c9fd16 100644 --- a/Build.PL +++ b/Build.PL @@ -10,7 +10,7 @@ my $build = Module::Build->new( 'Scalar::Util' => 1.10, }, recommends => { -# 'Class::C3::XS' => 0.01, + 'Class::C3::XS' => 0.01, }, build_requires => { 'Test::More' => '0.47', diff --git a/README b/README index 3289d3d..12b92e8 100644 --- a/README +++ b/README @@ -17,6 +17,11 @@ This module requires these other modules and libraries: Algorithm::C3 0.06 Scalar::Util 1.10 +Additionally, this module will optionally take advantage of +these if installed: + + Class::C3::XS 0.01 + SPECIAL NOTE FOR 0.15_01 To try this with the experimental perl core c3 patch, diff --git a/lib/Class/C3.pm b/lib/Class/C3.pm index 0b8c826..9bec670 100644 --- a/lib/Class/C3.pm +++ b/lib/Class/C3.pm @@ -7,17 +7,21 @@ use warnings; our $VERSION = '0.15_01'; 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__ @@ -471,6 +484,16 @@ limitation of this module. =back +=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 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. + +=head1 Class::C3::XS + +This module will load L<Class::C3::XS> 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<Class::C3>). + =head1 CODE COVERAGE I use B<Devel::Cover> to test the code coverage of my tests, below is the B<Devel::Cover> report on this