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 shifts 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.