NAME
Role::MethodReturns - around Method Modifiers with Parameter & Return Type Check
SYNOPSIS
package My::Class::interface;
use Role::MethodReturns;
use Types::Standard qw/:all/;
around create_object => class_method ( Str $name, Int $age ) {
returns( InstanceOf['My::Class'] ,
$original->( $class => ( $name, $age )
)
};
package My::Class;
use Role::Tiny::With;
with My::Class::interface unless $ENV{ROLE_METHOD_RETURN}
sub create_object {
...
}
DESCRIPTION
Some languages have beautiful ways to describe a 'interface', explicitly showing what methods are available, what arguments need to be passed in and what it will return.
Perl does not.
But we have CPAN... Role::MethodReturns will bring some of this, by providing a few 'imports'.
EXPORTS
The following are exported into the callers namespace:
around
This is the around
method modifier, imported from Role::Tiny. Basically, the interface being described, is nothing else than a role.
parameters
around $method => parameters ( $Type $foo, $Type $bar ) { ... }
After this keyword, it expects a list of parameters, that can have type constraints, like those from Type::Tiny. parameters
is a specific import using Function::Parameters and shift
s off $orig
and $self
.
So, inside the around method modifier CODEBLOCK, one can do:
$orig->( $self => ( ... ) );
instance_method
around $method => instance_method ( $Type $foo, $Type $bar ) { ... }
Like parameters, but instead of $self
generates a $instance
variable, which must be of the type Object
, from Types::Standard.
And inside the CODEBLOCK:
$original->( $instance => ( ... ) );
class_method
around $method => class_method ( $Type $foo, $Type $bar ) { ... }
Like parameters, but instead of $self
generates a $class
variable, which must be of the type ClassName
, from Types::Standard.
And inside the CODEBLOCK:
$original->( $class => ( ... ) );
method_parameters
around $method => method_parameters ( $Type $foo, $Type $bar ) { ... }
Like parameters, but instead of $self
generates a $invocant
variable, which must be of the type Invocant
, from Type::Params. Which is the union of Object
type and <Class> type. Incase it is not sure which is being used.
And inside the CODEBLOCK:
$original->( $invocant => ( ... ) );
returns
returns ( $Type , $return_value )
Checks that the $return_value
is of type $Type
and returns that value, or dies otherwise.
This is borrowed from assert_return
, found in Type::Tiny and friends.
maybe_returns
maybe_returns ( $Type , $return_value )
Just like returns, however will accept undef
as well.
returns_self
returns ( $self , $return_value )
Checks that the the $return_value
, is the same as $self
. That is just for convenience when your method allows chaining and returns the same object.
maybe_returns_self
returns ( $self , $return_value )
Same as returns_self except that it allows for undef
to be returned. This could be nice for interfaces that do not want to throw exceptions and use undef
as a return value, to indicate that 'something' went wrong and therfore do not return $self.
Be warned, allowing undef
to be returned, this will break the moment one will try to chain methods. This causes "Can't call method $foo on undef" errors. Which, of course, can be caught using try
blocks.