Sub::Meta - handle subroutine meta information
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'] $meta->is_method # undef $meta->parameters # undef $meta->returns # undef # setter $meta->set_subname('world'); $meta->subname; # world $meta->fullname; # main::world # apply to sub $meta->apply_prototype('$@'); $meta->prototype; # $@ Sub::Util::prototype($meta->sub); # $@
And you can hold meta information of parameter type and return type. See also Sub::Meta::Parameters and Sub::Meta::Returns.
$meta->set_parameters(args => ['Str'])); $meta->parameters->args; # [ Sub::Meta::Param->new({ type => 'Str' }) ] $meta->set_args(['Str']); $meta->args; # [ Sub::Meta::Param->new({ type => 'Str' }) ] $meta->set_returns('Str'); $meta->returns->scalar; # 'Str' $meta->returns->list; # 'Str'
And you can compare meta informations:
my $other = Sub::Meta->new(subname => 'hello'); $meta->is_same_interface($other); # 1 $meta eq $other; # 1
Sub::Meta provides methods to handle subroutine meta information. In addition to information that can be obtained from subroutines using module B etc., subroutines can have meta information such as arguments and return values.
Sub::Meta
Constructor of Sub::Meta.
use Sub::Meta; use Types::Standard -types; # sub Greeting::hello(Str) -> Str Sub::Meta->new( fullname => 'Greeting::hello', is_constant => 0, prototype => '$', attribute => ['method'], is_method => 1, parameters => { args => [{ type => Str }]}, returns => Str, );
Others are as follows:
# sub add(Int, Int) -> Int Sub::Meta->new( subname => 'add', args => [Int, Int], returns => Int, ); # method hello(Str) -> Str Sub::Meta->new( subname => 'hello', args => [{ message => Str }], is_method => 1, returns => Str, ); # sub twice(@numbers) -> ArrayRef[Int] Sub::Meta->new( subname => 'twice', args => [], slurpy => { name => '@numbers' }, returns => ArrayRef[Int], ); # Named parameters: # sub foo(Str :a) -> Str Sub::Meta->new( subname => 'foo', args => { a => Str }, returns => Str, ); # is equivalent to Sub::Meta->new( subname => 'foo', args => [{ name => 'a', isa => Str, named => 1 }], returns => Str, );
A subroutine reference.
Setter for subroutine reference.
sub hello { ... } $meta->set_sub(\&hello); $meta->sub # => \&hello
A subroutine name, e.g. hello
hello
Setter for subroutine name.
$meta->subname; # hello $meta->set_subname('world'); $meta->subname; # world Sub::Util::subname($meta->sub); # hello (NOT apply to sub)
Sets subroutine name and apply to the subroutine reference.
$meta->subname; # hello $meta->apply_subname('world'); $meta->subname; # world Sub::Util::subname($meta->sub); # world
A subroutine full name, e.g. main::hello
main::hello
Setter for subroutine full name.
A subroutine stash name, e.g. main
main
Setter for subroutine stash name.
A subroutine information, e.g. ['main', 'hello']
['main', 'hello']
Setter for subroutine information.
A filename where subroutine is defined, e.g. path/to/main.pl.
path/to/main.pl
Setter for file.
file
A line where the definition of subroutine started, e.g. 5
5
Setter for line.
line
A boolean value indicating whether the subroutine is a constant or not.
Setter for is_constant.
is_constant
A prototype of subroutine reference, e.g. $@
$@
Setter for prototype.
prototype
Sets subroutine prototype and apply to the subroutine reference.
A attribute of subroutine reference, e.g. undef, ['method']
undef
['method']
Setter for attribute.
attribute
Sets subroutine attributes and apply to the subroutine reference.
A boolean value indicating whether the subroutine is a method or not.
Setter for is_method.
is_method
Parameters object of Sub::Meta::Parameters.
Sets the parameters object of Sub::Meta::Parameters.
my $meta = Sub::Meta->new; $meta->set_parameters(args => ['Str']); $meta->parameters; # => Sub::Meta::Parameters->new(args => ['Str']); # or $meta->set_parameters(Sub::Meta::Parameters->new(args => ['Str'])); # alias $meta->set_args(['Str']);
The alias of parameters.args.
parameters.args
The alias of parameters.set_args.
parameters.set_args
The alias of parameters.nshift.
parameters.nshift
The alias of parameters.set_nshift.
parameters.set_nshift
The alias of parameters.slurpy.
parameters.slurpy
The alias of parameters.set_slurpy.
parameters.set_slurpy
Returns object of Sub::Meta::Returns.
Sets the returns object of Sub::Meta::Returns or any object.
my $meta = Sub::Meta->new; $meta->set_returns({ type => 'Type'}); $meta->returns; # => Sub::Meta::Returns->new({type => 'Type'}); # or $meta->set_returns(Sub::Meta::Returns->new(type => 'Foo')); $meta->set_returns(MyReturns->new)
A boolean value indicating whether the subroutine's interface is same or not. Specifically, check whether subname, is_method, parameters and returns are equal.
subname
parameters
returns
Returns inlined is_same_interface string:
is_same_interface
use Sub::Meta; my $meta = Sub::Meta->new(subname => 'hello'); my $inline = $meta->is_same_interface_inlined('$_[0]'); # $inline looks like this: # Scalar::Util::blessed($_[0]) && $_[0]->isa('Sub::Meta') # && defined $_[0]->subname && 'hello' eq $_[0]->subname # && !$_[0]->is_method # && !$_[0]->parameters # && !$_[0]->returns my $check = eval "sub { $inline }"; $check->(Sub::Meta->new(subname => 'hello')); # => OK $check->(Sub::Meta->new(subname => 'world')); # => NG
Returns class name of parameters. default: Sub::Meta::Parameters Please override for customization.
Returns class name of returns. default: Sub::Meta::Returns Please override for customization.
You can set meta information of subroutine. set_xxx sets xxx and does not affect subroutine reference. On the other hands, apply_xxx sets xxx and apply xxx to subroutine reference.
set_xxx
xxx
apply_xxx
Setter methods of Sub::Meta returns meta object. So you can chain setting:
$meta->set_subname('foo') ->set_stashname('Some')
By default Sub::Meta tries to load an XS implementation for speed. If that fails, or if the environment variable PERL_SUB_META_PP is defined to a true value, it will fall back to a pure perl implementation.
PERL_SUB_META_PP
Sub::Identify, Sub::Util, Sub::Info, Function::Paramters::Info, Function::Return::Info
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 Sub::Meta, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Sub::Meta
CPAN shell
perl -MCPAN -e shell install Sub::Meta
For more information on module installation, please visit the detailed CPAN module installation guide.