NAME

MRO::Magic - write your own method dispatcher

VERSION

version 0.100000

WARNING

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!

USAGE

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';
1;

...and...

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:

$dom->children;

...will redispatch to:

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

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

AUTHOR

Ricardo SIGNES <rjbs@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2011 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.