=begin pod

=TITLE role Metamodel::C3MRO

=SUBTITLE Metaobject that supports the C3 method resolution order

    role Metamodel::C3MRO { }

L<Meta model|/language/mop> role for the L<I<C3> method resolution order
(MRO)|https://en.wikipedia.org/wiki/C3_linearization>.

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>,
L<callsame>, L<nextwith> or L<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;
    # (Weird) (Child1) (GrandChild2) (Child2) (CommonAncestor) (Any) (Mu)
=end code

C3 is the default resolution order for classes and grammars in Perl 6.
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 compute_mro

    method compute_mro($type)

Computes the method resolution order.

=head2 mro

    method mro($type)

Returns a list of types in the method resolution order.

    say Int.^mro    # (Int) (Cool) (Any) (Mu)

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

=head2 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
