Sub::Meta - handle subroutine meta information - metacpan.org
Sub::Meta
is a module to handle meta information such as subroutine names and subroutine input/output.
There are similar modules such as Sub::Identify
,Sub::Util
and Sub::Info
, but writeSub::Meta
because it can not handle the meta information of the input/output of the subroutine.
The basic usage is as follows.
You can get meta information based on the code reference:
use Sub::Meta;
sub hello($) :mehtod { }
my $meta = Sub::Meta->new(sub => \&hello);
$meta->subname; # hello
$meta->sub; # \&hello
$meta->subname; # hello
$meta->fullname; # main::hello
$meta->stashname; # main
$meta->file; # path/to/file.pl
$meta->line; # 5
$meta->is_constant; # !!0
$meta->prototype; # $
$meta->attribute; # ['method']
You can also handle meta information without passing a code reference:
my $meta = Sub::Meta->new(subname => 'foo');
$meta->subname; # foo
Function input/output meta information can be added:
# INPUT
my $parameters = Sub::Meta::Parameters->new(
args => [
{ name => '$a', type => 'Int' },
{ name => '$b', type => 'Int'},
],
nshift => 1,
);
$meta->set_parameters($paramters);
$meta->parameters->args;
# [
# Sub::Meta::Param->new({ name => '$a', type => 'Int' }),
# Sub::Meta::Param->new({ name => '$b', type => 'Int' })
# ]
# OUTPUT
my $returns = Sub::Meta::Returns->new(
scalar => 'Int',
list => 'Int',
);
$meta->set_returns($returns);
$meta->returns->scalar; # 'Int'
Let's dig into the motivations for working with function input and output meta information.
Perl5 has many modules that validate function input, such as Params::Validate
,Data::Validator
, Smart::Args
,Function::Parameters
, Type::Params
, etc.
Each module has different usability, I thought it was somewhat stressful.
Also, I wanted to do Static analysis because I was annotating the types.
Therefore, I thought that if there is an object that handles meta information of the input of the function, it will be easier to handle in a unified I/F.
The same is true for function output.
Also, when trying to express a Java-like Interface in Perl5 such as Function::Interface
, it is useful if the input/output of functions is easy to handle.
The current F::I
is sticky in the Function::Parameters
and Function::Return
implementations, and I thought that it could not handle many applications and lacked flexibility.
That's why I created Sub::Meta
that can handle meta information including function input and output. I'm glad to try it if it is good! That's all!
Top comments (0)