MRO::Magic - write your own method dispatcher


version 0.100002


This module is shipped with no promise about what version of perl it will require in the future. In practice, this tends to mean "you need a perl from the last three years," but you can't rely on that. If a new version of perl ship, this software may begin to require it for any reason, and there is no promise that patches will be accepted to lower the minimum required perl.


First off, at present (2009-05-25) this code requires a development version of perl. It should run on perl5 v10.1, but that isn't out yet, so be patient or install a development perl.

Secondly, the API is not guaranteed to change in massive ways. This code is the result of playing around, not of careful design.

Finally, using MRO::Magic anywhere will impact the performance of all of your program. Every time a method is called via MRO::Magic, the entire method resolution class for all classes is cleared.

You have been warned!


First you write a method dispatcher.

  package MRO::Classless;
  use MRO::Magic
    metamethod => \'invoke_method',
    passthru   => [ qw(VERSION import unimport DESTROY) ];

  sub invoke_method {
    my ($invocant, $method_name, $args) = @_;


    return $rv;

In a class using this dispatcher, any method not in the passthru specification is redirected to invoke_method, which can do any kind of ridiculous thing it wants.

Now you use the dispatcher:

  package MyDOM;
  use MRO::Classless;
  use mro 'MRO::Classless';


  use MyDOM;

  my $dom = MyDOM->new(type => 'root');

The new call will actually result in a call to invoke_method in the form:

  invoke_method('MyDOM', 'new', [ type => 'root' ]);

Assuming it returns an object blessed into MyDOM, then:


...will redispatch to:

  invoke_method($dom, 'children', []);

For examples of more practical use, look at the test suite.


Ricardo SIGNES <>


Ricardo Signes <>


This software is copyright (c) 2022 by Ricardo SIGNES.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.