NAME
Method::Utils
- functional-style utilities for method calls
SYNOPSIS
use Method::Utils qw( maybe possibly inwardly );
$obj->${maybe "do_thing"}(@args);
# equivalent to
# $obj->do_thing(@args) if defined $obj;
$obj->${possibly "do_another"}(@args);
# equivalent to
# $obj->do_another(@args) if $obj->can( "do_another" );
$obj->${inwardly "do_all_these"}();
# invokes the method on every subclass in 'mro' order
FUNCTIONS
All of the following functions are intended to be used as method call modifiers. That is, they return a SCALAR
reference to a CODE
reference which allows them to be used in the following syntax
$ball->${possibly "bounce"}( "10 metres" );
Since the returned double-reference can be dereferenced by ${ }
to obtain the CODE
reference directly, it can be used to create new methods. For example:
*bounce_if_you_can = ${possibly "bounce"};
This is especially useful for creating methods in base classes which distribute across all the classes in a class heirarchy; for example
*DESTROY = ${inwardly "COLLAPSE"};
maybe $method
Invokes the named method on the object or class, if one is provided, and return what it returned. If invoked on undef
, returns undef
in scalar context or the empty list in list context.
$method
here may also be a double-ref to a CODE
, such as returned by the remaining utility functions given below. In this case, it will be dereferenced automatically, allowing you to conveniently perform
$obj->${maybe possibly 'method'}( @args )
possibly $method
Invokes the named method on the object or class and return what it returned, if it exists. If the method does not exist, returns undef
in scalar context or the empty list in list context.
inwardly $method
outwardly $method
Invokes the named method on the object or class for every class that provides such a method in the @ISA
heirarchy, not just the first one that is found. inwardly
searches all the classes in mro order, finding the class itself first and then its superclasses. outwardly
runs in reverse, starting its search at the base-most superclass, searching upward before finally ending at the class itself.
TODO
Consider
hopefully $method
, which wouldeval{}
-wrap the call, returningundef
/empty if it failed.Consider better ways to combine more of these. E.g.
hopefully inwardly
wouldeval{}
-wrap each subclass call.inwardly
withoutpossibly
would fail if no class provides the method.
SEE ALSO
http://shadow.cat/blog/matt-s-trout/madness-with-methods/ - Madness With Methods
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>