Module: Mojo::DynamicMethods


Mojo::DynamicMethods - Fast dynamic method dispatch


package MyClass;
use Mojo::Base -base, -signatures;

use Mojo::DynamicMethods -dispatch;

sub BUILD_DYNAMIC ($class, $method, $dyn_methods) {
  return sub {...};

sub add_helper ($self, $name, $cb) {
  Mojo::DynamicMethods::register 'MyClass', $self, $name, $cb;

package main;

# Generate methods dynamically (and hide them from "$obj->can(...)")
my $obj = MyClass->new;
$obj->add_helper(foo => sub { warn 'Hello Helper!' });


Mojo::DynamicMethods provides dynamic method dispatch for per-object helper methods without requiring use of AUTOLOAD.

To opt your class into dynamic dispatch simply pass the -dispatch flag.

use Mojo::DynamicMethods -dispatch;

And then implement a BUILD_DYNAMIC method in your class, making sure that the key you use to lookup methods in $dyn_methods is the same thing you pass as $ref to "register".

sub BUILD_DYNAMIC ($class, $method, $dyn_methods) {
  return sub ($self, @args) {
    my $dynamic = $dyn_methods->{$self}{$method};
    return $self->$dynamic(@args) if $dynamic;
    my $package = ref $self;
    croak qq{Can't locate object method "$method" via package "$package"};

Note that this module will summon Cthulhu, use it at your own risk!


Mojo::DynamicMethods implements the following functions.


Mojo::DynamicMethods::register $class, $ref, $name, $cb;

Registers the method $name as eligible for dynamic dispatch for $class, and sets $cb to be looked up for $name by reference $ref in a dynamic method constructed by BUILD_DYNAMIC.


Mojolicious, Mojolicious::Guides,