X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FC3.pm;h=5b633d5b2565de129f1ecad9841254bc6adff030;hb=bfcddb67024986e72eea2664778628014ca1669d;hp=a9158ed1783c8d70d32a57d54ad42b07d6c8db27;hpb=f093ecf6e0a96a5f4ad8d8e0b760f001eaeb4b3a;p=gitmo%2FClass-C3.git diff --git a/lib/Class/C3.pm b/lib/Class/C3.pm index a9158ed..5b633d5 100644 --- a/lib/Class/C3.pm +++ b/lib/Class/C3.pm @@ -82,7 +82,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 @@ -93,7 +93,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}; @@ -118,8 +118,13 @@ 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}; + ${"${class}::$method"} = $$orig if defined $$orig; + } *{"${class}::$method"} = $MRO{$class}->{methods}->{$method}->{code}; } }