```{index} single: mro; Perl module ``` # mro ```{pperl-module-badges} mro ``` 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 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) Set the method-resolution algorithm for `$class` to either `"dfs"` or `"c3"`. ### MRO introspection #### [`get_linear_isa`](mro/get_linear_isa) 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) List every class that inherits from `$class`, directly or transitively, via `@ISA`. #### [`get_pkg_gen`](mro/get_pkg_gen) Return a counter that increments every time a local method in `$class` changes or its local `@ISA` is modified. #### [`is_universal`](mro/is_universal) Report whether `$class` is `UNIVERSAL` itself or one of its ancestors via `@ISA`. ### Method cache #### [`method_changed_in`](mro/method_changed_in) Force method-cache invalidation for `$class` and everything that inherits from it. #### [`invalidate_all_method_caches`](mro/invalidate_all_method_caches) Invalidate the method cache for every package in the interpreter. ### next:: dispatch #### [`nextcan`](mro/nextcan) The `mro::_nextcan` primitive that underpins `next::method`, `next::can`, and `maybe::next::method`. #### [`next_can`](mro/next_can) Return a code reference to the next implementation of the currently executing method, or `undef` if there is none. #### [`next_method`](mro/next_method) Tail-call the next implementation of the currently executing method, passing the original arguments. #### [`maybe_next_method`](mro/maybe_next_method) Tail-call the next implementation of the currently executing method if one exists; otherwise return quietly. ```{toctree} :hidden: :maxdepth: 1 mro/get_linear_isa mro/set_mro mro/get_isarev mro/get_pkg_gen mro/is_universal mro/method_changed_in mro/invalidate_all_method_caches mro/nextcan mro/next_can mro/next_method mro/maybe_next_method ```