Merge branch 'master' into metadata
Lukas Mai [Mon, 19 Nov 2012 19:21:40 +0000 (20:21 +0100)]
1  2 
lib/Function/Parameters.pm

@@@ -8,7 -8,7 +8,7 @@@ use Carp qw(confess)
  
  use XSLoader;
  BEGIN {
-       our $VERSION = '1.00';
+       our $VERSION = '1.0003';
        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<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
@@@ -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<Function::Parameters::Info>
 +
  =head1 AUTHOR
  
  Lukas Mai, C<< <l.mai at web.de> >>