X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FClass.pm;h=c7f8807008c0d7c081772f1c01e8d2bac289d9da;hb=77a143bafdd524b01eb35af7d47c2a1d5554b5e2;hp=68c3d475a3f61676050c1c5bea75c478af185aad;hpb=da34f0548381c10dba4299089c07ffe64a0706e1;p=gitmo%2FClass-MOP.git diff --git a/lib/Class/MOP/Class.pm b/lib/Class/MOP/Class.pm index 68c3d47..c7f8807 100644 --- a/lib/Class/MOP/Class.pm +++ b/lib/Class/MOP/Class.pm @@ -512,6 +512,7 @@ sub linearized_isa { sub class_precedence_list { my $self = shift; + my $name = $self->name; unless (Class::MOP::IS_RUNNING_ON_5_10()) { # NOTE: @@ -521,15 +522,26 @@ sub class_precedence_list { # blow up otherwise. Yes, it's an ugly hack, better # suggestions are welcome. # - SL - ($self->name || return)->isa('This is a test for circular inheritance') + ($name || return)->isa('This is a test for circular inheritance') } - ( - $self->name, - map { - $self->initialize($_)->class_precedence_list() - } $self->superclasses() - ); + # if our mro is c3, we can + # just grab the linear_isa + if (mro::get_mro($name) eq 'c3') { + return @{ mro::get_linear_isa($name) } + } + else { + # NOTE: + # we can't grab the linear_isa for dfs + # since it has all the duplicates + # already removed. + return ( + $name, + map { + $self->initialize($_)->class_precedence_list() + } $self->superclasses() + ); + } } ## Methods