NAME
Mojo::DynamicMethods - Fast dynamic method dispatch
SYNOPSIS
package MyClass;
use Mojo::Base -base;
use Mojo::DynamicMethods -dispatch;
sub BUILD_DYNAMIC {
my ($class, $method, $dyn_methods) = @_;
return sub {...};
}
sub add_helper {
my ($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!' });
$obj->foo;
DESCRIPTION
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 {
my ($class, $method, $dyn_methods) = @_;
return sub {
my ($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 is EXPERIMENTAL and might change without warning!
FUNCTIONS
Mojo::DynamicMethods implements the following functions.
register
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
.