=begin pod :kind("Type") :subkind("role") :category("metamodel")

=TITLE role Metamodel::C3MRO

=SUBTITLE Metaobject that supports the C3 method resolution order

    role Metamodel::C3MRO { }

I<Warning>: this role is part of the Rakudo implementation, and is not
a part of the language specification.

L<Metamodel|/language/mop> role for the
L<I<C3> method resolution order (MRO)|https://en.wikipedia.org/wiki/C3_linearization>.
I<Note>: this method,
along with almost the whole metamodel, is part of the Rakudo implementation.

The I<method resolution order> for a type is a flat list of types including the
type itself, and (recursively) all super classes. It determines in which order
the types will be visited for determining which method to call with a given
name, or for finding the next method in a chain with
L<nextsame|/language/functions#sub_nextsame>,
L<callsame|/language/functions#sub_callsame>,
L<nextwith|/language/functions#sub_nextwith> or
L<callwith|/language/functions#sub_callwith>.

=begin code
class CommonAncestor { };   # implicitly inherits from Any
class Child1 is CommonAncestor { }
class Child2 is CommonAncestor { }
class GrandChild2 is Child2 { }
class Weird is Child1 is GrandChild2 { };

say Weird.^mro; # OUTPUT: «(Weird) (Child1) (GrandChild2) (Child2) (CommonAncestor) (Any) (Mu)␤»
=end code

C3 is the default resolution order for classes and grammars in Raku.
Note that roles generally do not appear in the method resolution order (unless
they are punned into a class, from which another type inherits), because
methods are copied into classes at role application time.

=head1 Methods

=head2 method compute_mro

    method compute_mro($type)

Computes the method resolution order.

=head2 method mro

    method mro($type)

Returns a list of types in the method resolution order, even those that are
marked C<is hidden>.

    say Int.^mro;   # OUTPUT: «((Int) (Cool) (Any) (Mu))␤»

=head2 method mro_unhidden

    method mro_unhidden($type)

Returns a list of types in method resolution order, excluding those that are
marked with C<is hidden>.

=end pod
