use v5.14.0;
-use strict;
use warnings;
use Carp qw(confess);
use XSLoader;
BEGIN {
- our $VERSION = '0.10_03';
+ our $VERSION = '1.0003';
XSLoader::load;
}
}
+our %metadata;
+
+sub _register_info {
+ my (
+ $key,
+ $declarator,
+ $invocant,
+ $positional_required,
+ $positional_optional,
+ $named_required,
+ $named_optional,
+ $slurpy,
+ ) = @_;
+
+ my $blob = pack '(Z*)*',
+ $declarator,
+ $invocant // '',
+ join(' ', @$positional_required),
+ join(' ', @$positional_optional),
+ join(' ', @$named_required),
+ join(' ', @$named_optional),
+ $slurpy // '',
+ ;
+
+ $metadata{$key} = $blob;
+}
+
+sub info {
+ my ($func) = @_;
+ my $key = _cv_root $func or return undef;
+ my $blob = $metadata{$key} or return undef;
+ my @info = unpack '(Z*)*', $blob;
+ require Function::Parameters::Info;
+ Function::Parameters::Info->new(
+ keyword => $info[0],
+ invocant => $info[1] || undef,
+ _positional_required => [split ' ', $info[2]],
+ _positional_optional => [split ' ', $info[3]],
+ _named_required => [split ' ', $info[4]],
+ _named_optional => [split ' ', $info[5]],
+ slurpy => $info[6] || undef,
+ )
+}
+
'ok'
__END__
C<use Function::Parameters qw(:strict)> is equivalent to
C<< use Function::Parameters { fun => 'function_strict', method => 'method_strict' } >>.
+=head2 Introspection
+
+You can ask a function at runtime what parameters it has. This functionality is
+available through the function C<Function::Parameters::info> (which is not
+exported, so you have to call it by its full name). It takes a reference to a
+function, and returns either C<undef> (if it knows nothing about the function)
+or a L<Function::Parameters::Info> object describing the parameter list.
+
+Note: This feature is implemented using L<Moo>, so you'll need to have L<Moo>
+installed if you want to call C<Function::Parameters::info>.
+
+See L<Function::Parameters::Info> for examples.
+
=head2 Wrapping C<Function::Parameters>
If you want to write a wrapper around C<Function::Parameters>, you only have to
# ... turns into ...
sub bar :method { my $self = shift; my ($x, $y, @z) = @_; sub bar; ... }
+=head1 SEE ALSO
+
+L<Function::Parameters::Info>
+
=head1 AUTHOR
Lukas Mai, C<< <l.mai at web.de> >>