NAME
Mojo::DynamicMethods - Fast dynamic method dispatch
SYNOPSIS
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!'
});
$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 (
$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!
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
.