# mro
📦 min
Method Resolution Order — how Perl decides which parent class’s method a call inherits.
When a method is called on an object, Perl walks a list of classes
looking for a matching subroutine. That list — the *linearized
MRO* — is derived from `@ISA` and from the algorithm currently in
effect for the class. The `mro` module lets you pick the
algorithm, inspect the resulting class list, query the reverse
`@ISA` relation, and manage the method cache.
Two algorithms are available. `dfs` (depth-first search) is the
default and matches Perl’s historical behaviour. `c3` produces
the *C3 linearization* familiar from Python, Dylan, and Raku,
which keeps subclasses ahead of their ancestors even under
diamond inheritance. Pick `c3` when multiple inheritance makes
the `dfs` order surprising; otherwise leave the default alone.
Loading the module also enables `next::method`, `next::can`, and
`maybe::next::method` — the C3-aware cousins of `SUPER::`. They
always walk the C3 linearization regardless of which MRO the
class itself uses.
## Synopsis
```none
use mro; # enables next::method, next::can, maybe::next::method
use mro 'c3'; # set C3 linearization for the current package
use mro 'dfs'; # set depth-first (Perl's default) explicitly
my $order = mro::get_linear_isa('MyClass'); # arrayref of class names
my $algo = mro::get_mro('MyClass'); # "dfs" or "c3"
mro::set_mro('MyClass', 'c3'); # set per-class at runtime
```
## Functions
### MRO selection
#### [`set_mro`](mro/set_mro.md)
Set the method-resolution algorithm for `$class` to either `"dfs"` or `"c3"`.
### MRO introspection
#### [`get_linear_isa`](mro/get_linear_isa.md)
Return the full ordered list of classes Perl would search for a method call on `$class`, starting with `$class` itself.
#### `get_mro`
Report which method-resolution algorithm is currently in effect for `$class`.
**Synopsis**
my $algo = mro::get_mro($class); # «dfs» or «c3»
Returns the string `"dfs"` or `"c3"`. Classes that have never
called `set_mro` or `use mro '...'` report `"dfs"` (Perl’s
default). Calling on a non-existent class also reports `"dfs"`;
the call does not force the stash into existence.
#### [`get_isarev`](mro/get_isarev.md)
List every class that inherits from `$class`, directly or transitively, via `@ISA`.
#### [`get_pkg_gen`](mro/get_pkg_gen.md)
Return a counter that increments every time a local method in `$class` changes or its local `@ISA` is modified.
#### [`is_universal`](mro/is_universal.md)
Report whether `$class` is `UNIVERSAL` itself or one of its ancestors via `@ISA`.
### Method cache
#### [`method_changed_in`](mro/method_changed_in.md)
Force method-cache invalidation for `$class` and everything that inherits from it.
#### [`invalidate_all_method_caches`](mro/invalidate_all_method_caches.md)
Invalidate the method cache for every package in the interpreter.
### next:: dispatch
#### [`nextcan`](mro/nextcan.md)
The `mro::_nextcan` primitive that underpins `next::method`, `next::can`, and `maybe::next::method`.
#### [`next_can`](mro/next_can.md)
Return a code reference to the next implementation of the currently executing method, or `undef` if there is none.
#### [`next_method`](mro/next_method.md)
Tail-call the next implementation of the currently executing method, passing the original arguments.
#### [`maybe_next_method`](mro/maybe_next_method.md)
Tail-call the next implementation of the currently executing method if one exists; otherwise return quietly.