From: Lukas Mai Date: Tue, 5 Feb 2013 00:57:40 +0000 (+0100) Subject: Merge branch 'master' into metadata X-Git-Tag: v1.0101~3^2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b9c12f70b2c7b73970cefbb5b41982ef22477ace;hp=-c;p=p5sagit%2FFunction-Parameters.git Merge branch 'master' into metadata --- b9c12f70b2c7b73970cefbb5b41982ef22477ace diff --combined lib/Function/Parameters.pm index 62db745,59d9bdc..a3afc55 --- a/lib/Function/Parameters.pm +++ b/lib/Function/Parameters.pm @@@ -8,7 -8,7 +8,7 @@@ use Carp qw(confess) use XSLoader; BEGIN { - our $VERSION = '1.0003'; + our $VERSION = '1.0004'; XSLoader::load; } @@@ -155,50 -155,6 +155,50 @@@ sub unimport } +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__ @@@ -613,19 -569,6 +613,19 @@@ C<< use Function::Parameters { fun => ' C 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 (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 (if it knows nothing about the function) +or a L object describing the parameter list. + +Note: This feature is implemented using L, so you'll need to have L +installed if you want to call C. + +See L for examples. + =head2 Wrapping C If you want to write a wrapper around C, you only have to @@@ -656,10 -599,6 +656,10 @@@ generated code corresponds to # ... turns into ... sub bar :method { my $self = shift; my ($x, $y, @z) = @_; sub bar; ... } +=head1 SEE ALSO + +L + =head1 AUTHOR Lukas Mai, C<< >>