Merge branch 'master' into metadata
[p5sagit/Function-Parameters.git] / lib / Function / Parameters.pm
index 59d9bdc..a3afc55 100644 (file)
@@ -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__
@@ -569,6 +613,19 @@ C<< use Function::Parameters { fun => 'function', method => 'method' } >>.
 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
@@ -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<Function::Parameters::Info>
+
 =head1 AUTHOR
 
 Lukas Mai, C<< <l.mai at web.de> >>