X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FClass-C3.git;a=blobdiff_plain;f=lib%2FClass%2FC3.pm;h=73e8228627a17b107c8af6b286c8ce7aac5f21ce;hp=1b6749025961028104cf50d77f9ace88c6c67dea;hb=f4a893b2743451ba7414466464e0e8d843458cfa;hpb=f480cda1e94bd73d3773e442a8767e73c544e140 diff --git a/lib/Class/C3.pm b/lib/Class/C3.pm index 1b67490..73e8228 100644 --- a/lib/Class/C3.pm +++ b/lib/Class/C3.pm @@ -7,7 +7,7 @@ use warnings; use Scalar::Util 'blessed'; use Algorithm::C3; -our $VERSION = '0.12'; +our $VERSION = '0.13'; # this is our global stash of both # MRO's and method dispatch tables @@ -67,15 +67,16 @@ sub reinitialize { ## functions for applying C3 to classes sub _calculate_method_dispatch_tables { + my %merge_cache; foreach my $class (keys %MRO) { - _calculate_method_dispatch_table($class); + _calculate_method_dispatch_table($class, \%merge_cache); } } sub _calculate_method_dispatch_table { - my $class = shift; + my ($class, $merge_cache) = @_; no strict 'refs'; - my @MRO = calculateMRO($class); + my @MRO = calculateMRO($class, $merge_cache); $MRO{$class} = { MRO => \@MRO }; my $has_overload_fallback = 0; my %methods; @@ -139,11 +140,11 @@ sub _remove_method_dispatch_table { ## functions for calculating C3 MRO sub calculateMRO { - my ($class) = @_; + my ($class, $merge_cache) = @_; return Algorithm::C3::merge($class, sub { no strict 'refs'; @{$_[0] . '::ISA'}; - }); + }, $merge_cache); } package # hide me from PAUSE @@ -570,4 +571,4 @@ L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. -=cut \ No newline at end of file +=cut