X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FAccessor%2FGrouped.pm;h=5fe4c3daf3d022b01c031380fb7ebc5abc2b05cc;hb=cc8ab1f27da5ced46c64e40474d7dd5f0be49fd7;hp=24b6971108875fddf0b7f6af9bbf21cfa5d00bb1;hpb=33fe229924ce0cfe5f74252774ff923910a70fbb;p=p5sagit%2FClass-Accessor-Grouped.git diff --git a/lib/Class/Accessor/Grouped.pm b/lib/Class/Accessor/Grouped.pm index 24b6971..5fe4c3d 100644 --- a/lib/Class/Accessor/Grouped.pm +++ b/lib/Class/Accessor/Grouped.pm @@ -282,16 +282,8 @@ sub get_inherited { my $cag_slot = '::__cag_'. $_[1]; return ${$class.$cag_slot} if defined(${$class.$cag_slot}); - # we need to be smarter about recalculation, as @ISA (thus supers) can very well change in-flight - my $cur_gen = mro::get_pkg_gen ($class); - if ( $cur_gen != ${$class.'::__cag_pkg_gen__'} ) { - @{$class.'::__cag_supers__'} = $_[0]->get_super_paths; - ${$class.'::__cag_pkg_gen__'} = $cur_gen; - } - - for (@{$class.'::__cag_supers__'}) { - return ${$_.$cag_slot} if defined(${$_.$cag_slot}); - }; + do { return ${$_.$cag_slot} if defined(${$_.$cag_slot}) } + for $_[0]->get_super_paths; return undef; } @@ -413,7 +405,10 @@ inherited from. This is what drives the traversal done by L. =cut sub get_super_paths { - return @{mro::get_linear_isa( ref($_[0]) || $_[0] )}; + # get_linear_isa returns the class itself as the 1st element + # use @_ as a pre-allocated scratch array + (undef, @_) = @{mro::get_linear_isa( length( ref($_[0]) ) ? ref($_[0]) : $_[0] )}; + @_; }; =head2 make_group_accessor