Ricardo SIGNES > MRO-Magic-0.100000 > MRO::Magic

Download:
MRO-Magic-0.100000.tar.gz

Dependencies

Annotate this POD

Website

View/Report Bugs
Module Version: 0.100000   Source   Latest Release: MRO-Magic-0.100001

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.

syntax highlighting: