version bump
[p5sagit/Function-Parameters.git] / lib / Function / Parameters / Info.pm
index 5177d4d..b18814c 100644 (file)
@@ -4,9 +4,35 @@ use v5.14.0;
 
 use warnings;
 
-use Moo;
+our $VERSION = '0.02';
+
+# If Moo isn't loaded yet but Moose is, avoid pulling in Moo and fall back to Moose
+my ($Moo, $meta_make_immutable);
+BEGIN {
+       if ($INC{'Moose.pm'} && !$INC{'Moo.pm'}) {
+               $Moo = 'Moose';
+               $meta_make_immutable = sub { $_[0]->meta->make_immutable };
+       } else {
+               require Moo;
+               $Moo = 'Moo';
+               $meta_make_immutable = sub {};
+       }
+       $Moo->import;
+}
+
+{
+       package Function::Parameters::Param;
+
+       BEGIN { $Moo->import; }
+       use overload
+               fallback => 1,
+               '""' => sub { $_[0]->name },
+       ;
 
-our $VERSION = '0.01';
+       has $_ => (is => 'ro') for qw(name type);
+
+       __PACKAGE__->$meta_make_immutable;
+}
 
 my @pn_ro = glob '{positional,named}_{required,optional}';
 
@@ -39,6 +65,8 @@ sub args_max {
        $r
 }
 
+__PACKAGE__->$meta_make_immutable;
+
 'ok'
 
 __END__
@@ -78,7 +106,7 @@ methods are available:
 =head2 $info->invocant
 
 Returns the name of the variable into which the first argument is
-L<C<shift>|perlfunc/shift>ed into automatically, or C<undef> if no such thing
+L<C<shift>|perlfunc/shift>ed automatically, or C<undef> if no such thing
 exists. This will usually return C<'$self'> for methods.
 
 =head2 $info->positional_required
@@ -123,6 +151,18 @@ Returns the maximum number of arguments this function accepts. This is computed
 as follows: If there is any named or slurpy parameter, the result is C<Inf>.
 Otherwise the result is the sum of all invocant and positional parameters.
 
+=head2 Experimental feature: Types
+
+All the methods described above actually return parameter objects wherever the
+description says "name". These objects have two methods: C<name>, which
+returns the name of the parameter (as a plain string), and C<type>, which
+returns the corresponding type constraint object (or undef if there was no type
+specified).
+
+This should be invisible if you don't use types because the objects also
+L<overload|overload> stringification to call C<name>. That is, if you treat
+parameter objects like strings, they behave like strings (i.e. their names).
+
 =head1 SEE ALSO
 
 L<Function::Parameters>
@@ -133,7 +173,7 @@ Lukas Mai, C<< <l.mai at web.de> >>
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2012 Lukas Mai.
+Copyright 2013 Lukas Mai.
 
 This program is free software; you can redistribute it and/or modify it
 under the terms of either: the GNU General Public License as published