Function::Return - specify a function return type
use Function::Return; use Types::Standard -types; sub foo :Return(Int) { 123 } sub bar :Return(Int) { 3.14 } foo(); # 123 bar(); # ERROR! Invalid type # multi return values sub baz :Return(Num, Str) { 3.14, 'message' } my ($pi, $msg) = baz(); my $count = baz(); # ERROR! Required list context. # empty return sub boo :Return() { return; } boo();
Function::Return allows you to specify a return type for your functions.
This module supports all perl versions starting from v5.14.
You can switch off type check. If you change globally, use <$ENV{FUNCTION_RETURN_NO_CHECK}>:
<$ENV{FUNCTION_RETURN_NO_CHECK}
BEGIN { $ENV{FUNCTION_RETURN_NO_CHECK} = 1; } use Function::Return; sub foo :Return(Int) { 3.14 } foo(); # NO ERROR!
And If you want to switch by a package, it is better to use the no_check option:
use Function::Return no_check => 1; sub foo :Return(Int) { 3.14 } foo(); # NO ERROR!
Function::Return automatically exports a return type by caller.
Or you can specify a package name:
use Function::Return pkg => 'MyClass';
:Return attribute is available.
:Return
This function lets you introspect return values:
use Function::Return; use Types::Standard -types; sub baz() :Return(Str) { 'hello' } my $meta = Function::Return::meta \&baz; # Sub::Meta $meta->returns->list; # [Str]
In addition, it can be used with Function::Parameters:
use Function::Parameters; use Function::Return; use Types::Standard -types; fun hello(Str $msg) :Return(Str) { 'hello' . $msg } my $meta = Function::Return::meta \&hello; # Sub::Meta $meta->returns->list; # [Str] $meta->args->[0]->type; # Str $meta->args->[0]->name; # $msg # Note Function::Parameters::info \&hello; # undef
This makes it possible to know both type information of function arguments and return value at compile time, making it easier to use for testing etc.
This interface is for power-user. Rather than using the :Return attribute, it's possible to wrap a coderef like this:
my $wrapped = Function::Return->wrap_sub($orig, [Str]); $wrapped->();
Function::Return makes the original function is called in list context whether the wrapped function is called in list, scalar, void context:
Function::Return
sub foo :Return(Str) { wantarray ? 'LIST!!' : 'NON!!' } my $a = foo(); # => LIST!!
The specified type checks against the value the original function was called in the list context.
wantarray is convenient, but it sometimes causes confusion. So, in this module, we prioritize that it easy to understand the type of function return value.
wantarray
The requirements of type constraint of Function::Return is the same as for Function::Parameters. Specific requirements are as follows:
> The only requirement is that the returned value (here referred to as $tc, for "type constraint") is an object that provides $tc->check($value) and $tc->get_message($value) methods. check is called to determine whether a particular value is valid; it should return a true or false value. get_message is called on values that fail the check test; it should return a string that describes the error.
Both Return::Type and Function::Return perform type checking on function return value, but have some differences.
1. Function::Return is not possible to specify different type constraints for scalar and list context, but Return::Type is possible.
Return::Type
2. Function::Return check type constraint for void context, but Return::Type doesn't.
3. Function::Return can be used together with Function::Parameters::Info, but Return::Type seems a bit difficult.
Function::Parameters::Info
Sub::Meta
Copyright (C) kfly8.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
kfly8 <kfly@cpan.org>
To install Function::Return, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Function::Return
CPAN shell
perl -MCPAN -e shell install Function::Return
For more information on module installation, please visit the detailed CPAN module installation guide.