1 package Function::Parameters;
12 our $VERSION = '0.09';
16 sub _assert_valid_identifier {
17 my ($name, $with_dollar) = @_;
18 my $bonus = $with_dollar ? '\$' : '';
19 $name =~ /^${bonus}[^\W\d]\w*\z/
20 or confess qq{"$name" doesn't look like a valid identifier};
23 sub _assert_valid_attributes {
25 $attrs =~ /^\s*:\s*[^\W\d]\w*\s*(?:(?:\s|:\s*)[^\W\d]\w*\s*)*(?:\(|\z)/
26 or confess qq{"$attrs" doesn't look like valid attributes};
29 my @bare_arms = qw(function method);
33 default_arguments => 1,
34 check_argument_count => 0,
38 default_arguments => 1,
39 check_argument_count => 0,
45 default_arguments => 1,
46 check_argument_count => 0,
47 attributes => ':method',
51 for my $k (keys %type_map) {
52 $type_map{$k . '_strict'} = {
54 check_argument_count => 1,
67 if (@_ == 1 && $_[0] eq ':strict') {
69 fun => 'function_strict',
70 method => 'method_strict',
73 if (@_ == 1 && ref($_[0]) eq 'HASH') {
74 @_ = map [$_, $_[0]{$_}], keys %{$_[0]};
83 : [$proto, $bare_arms[$bare++] || confess(qq{Don't know what to do with "$proto"})]
85 my ($name, $proto_type) = @$item;
86 _assert_valid_identifier $name;
88 unless (ref $proto_type) {
89 # use '||' instead of 'or' to preserve $proto_type in the error message
90 $proto_type = $type_map{$proto_type}
91 || confess qq["$proto_type" doesn't look like a valid type (one of ${\join ', ', sort keys %type_map})];
94 my %type = %$proto_type;
97 $clean{name} = delete $type{name} || 'optional';
98 $clean{name} =~ /^(?:optional|required|prohibited)\z/
99 or confess qq["$clean{name}" doesn't look like a valid name attribute (one of optional, required, prohibited)];
101 $clean{shift} = delete $type{shift} || '';
102 _assert_valid_identifier $clean{shift}, 1 if $clean{shift};
104 $clean{attrs} = join ' ', map delete $type{$_} || (), qw(attributes attrs);
105 _assert_valid_attributes $clean{attrs} if $clean{attrs};
107 $clean{default_arguments} =
108 exists $type{default_arguments}
109 ? !!delete $type{default_arguments}
112 $clean{check_argument_count} = !!delete $type{check_argument_count};
114 %type and confess "Invalid keyword property: @{[keys %type]}";
116 $spec{$name} = \%clean;
119 for my $kw (keys %spec) {
120 my $type = $spec{$kw};
123 $type->{name} eq 'prohibited' ? FLAG_ANON_OK :
124 $type->{name} eq 'required' ? FLAG_NAME_OK :
125 FLAG_ANON_OK | FLAG_NAME_OK
127 $flags |= FLAG_DEFAULT_ARGS if $type->{default_arguments};
128 $flags |= FLAG_CHECK_NARGS if $type->{check_argument_count};
129 $^H{HINTK_FLAGS_ . $kw} = $flags;
130 $^H{HINTK_SHIFT_ . $kw} = $type->{shift};
131 $^H{HINTK_ATTRS_ . $kw} = $type->{attrs};
132 $^H{+HINTK_KEYWORDS} .= "$kw ";
140 delete $^H{+HINTK_KEYWORDS};
145 $^H{+HINTK_KEYWORDS} =~ s/(?<![^ ])\Q$kw\E //g;
158 Function::Parameters - subroutine definitions with parameter lists
162 use Function::Parameters;
165 fun foo($bar, $baz) {
169 # function with prototype
170 fun mymap($fun, @args)
175 push @res, $fun->($_);
180 print "$_\n" for mymap { $_ * 2 } 1 .. 4;
182 # method with implicit $self
183 method set_name($name) {
184 $self->{name} = $name;
187 # function with default arguments
188 fun search($haystack, $needle = qr/^(?!)/, $offset = 0) {
192 # method with default arguments
193 method skip($amount = 1) {
194 $self->{position} += $amount;
201 # use different keywords
202 use Function::Parameters {
207 my $f = proc ($x) { $x * 2 };
214 This module lets you use parameter lists in your subroutines. Thanks to
215 L<PL_keyword_plugin|perlapi/PL_keyword_plugin> it works without source filters.
217 WARNING: This is my first attempt at writing L<XS code|perlxs> and I have
218 almost no experience with perl's internals. So while this module might
219 appear to work, it could also conceivably make your programs segfault.
220 Consider this module alpha quality.
224 To use this new functionality, you have to use C<fun> instead of C<sub> -
225 C<sub> continues to work as before. The syntax is almost the same as for
226 C<sub>, but after the subroutine name (or directly after C<fun> if you're
227 writing an anonymous sub) you can write a parameter list in parentheses. This
228 list consists of comma-separated variables.
230 The effect of C<fun foo($bar, $baz) {> is as if you'd written
231 C<sub foo { my ($bar, $baz) = @_; >, i.e. the parameter list is simply
232 copied into L<my|perlfunc/my-EXPR> and initialized from L<@_|perlvar/"@_">.
234 In addition you can use C<method>, which understands the same syntax as C<fun>
235 but automatically creates a C<$self> variable for you. So by writing
236 C<method foo($bar, $baz) {> you get the same effect as
237 C<sub foo { my $self = shift; my ($bar, $baz) = @_; >.
239 =head2 Customizing the generated keywords
241 You can customize the names of the keywords injected into your scope. To do
242 that you pass a reference to a hash mapping keywords to types in the import
245 use Function::Parameters {
253 use Function::Parameters { proc => 'function', meth => 'method' }; # -or-
254 use Function::Parameters { proc => 'function' }; # -or-
255 use Function::Parameters { meth => 'method' }; # etc.
257 The first line creates two keywords, C<proc> and C<meth> (for defining
258 functions and methods, respectively). The last two lines only create one
259 keyword. Generally the hash keys (keywords) can be any identifiers you want
260 while the values (types) have to be either a hash reference (see below) or
261 C<'function'>, C<'method'>, C<'classmethod'>, C<'function_strict'>,
262 C<'method_strict'>, or C<'classmethod_strict'>. The main difference between
263 C<'function'> and C<'method'> is that C<'method'>s automatically
264 L<shift|perlfunc/shift> their first argument into C<$self> (C<'classmethod'>s
265 are similar but shift into C<$class>).
267 The following shortcuts are available:
269 use Function::Parameters;
271 use Function::Parameters { fun => 'function', method => 'method' };
277 use Function::Parameters ':strict';
279 use Function::Parameters { fun => 'function_strict', method => 'method_strict' };
283 The following shortcuts are deprecated and may be removed from a future version
287 use Function::Parameters 'foo';
289 use Function::Parameters { 'foo' => 'function' };
296 use Function::Parameters 'foo', 'bar';
298 use Function::Parameters { 'foo' => 'function', 'bar' => 'method' };
300 That is, if you want to create custom keywords with L<Function::Parameters>,
301 use a hashref, not a list of strings.
303 You can tune the properties of the generated keywords even more by passing
304 a hashref instead of a string. This hash can have the following keys:
310 Valid values: C<optional> (default), C<required> (all uses of this keyword must
311 specify a function name), and C<prohibited> (all uses of this keyword must not
312 specify a function name). This means a C<< name => 'prohibited' >> keyword can
313 only be used for defining anonymous functions.
317 Valid values: strings that look like a scalar variable. Any function created by
318 this keyword will automatically L<shift|perlfunc/shift> its first argument into
319 a local variable whose name is specified here.
321 =item C<attributes>, C<attrs>
323 Valid values: strings that are valid source code for attributes. Any value
324 specified here will be inserted as a subroutine attribute in the generated
327 use Function::Parameters { sub_l => { attributes => ':lvalue' } };
338 It is recommended that you use C<attributes> in new code but C<attrs> is also
341 =item C<default_arguments>
343 Valid values: booleans. This property is on by default, so you have to pass
344 C<< default_arguments => 0 >> to turn it off. If it is disabled, using C<=> in
345 a parameter list causes a syntax error. Otherwise it lets you specify
346 default arguments directly in the parameter list:
348 fun foo($x, $y = 42, $z = []) {
355 my ($x, $y, $z) = @_;
361 You can even refer to previous parameters in the same parameter list:
363 print fun ($x, $y = $x + 1) { "$x and $y" }->(9); # "9 and 10"
365 This also works with the implicit first parameter of methods:
367 method scale($factor = $self->default_factor) {
368 $self->{amount} *= $factor;
371 =item C<check_argument_count>
373 Valid values: booleans. This property is off by default. If it is enabled, the
374 generated code will include checks to make sure the number of passed arguments
375 is correct (and otherwise throw an exception via L<Carp::croak|Carp>):
377 fun foo($x, $y = 42, $z = []) {
384 Carp::croak "Not enough arguments for fun foo" if @_ < 1;
385 Carp::croak "Too many arguments for fun foo" if @_ > 3;
386 my ($x, $y, $z) = @_;
394 Plain C<'function'> is equivalent to:
398 default_arguments => 1,
399 check_argument_count => 0,
402 (These are all default values so C<'function'> is also equivalent to C<{}>.)
404 C<'function_strict'> is like C<'function'> but with
405 C<< check_argument_count => 1 >>.
407 C<'method'> is equivalent to:
411 default_arguments => 1,
412 check_argument_count => 0,
413 attributes => ':method',
417 C<'method_strict'> is like C<'method'> but with
418 C<< check_argument_count => 1 >>.
420 C<'classmethod'> is equivalent to:
424 default_arguments => 1,
425 check_argument_count => 0,
426 attributes => ':method',
430 C<'classmethod_strict'> is like C<'classmethod'> but with
431 C<< check_argument_count => 1 >>.
433 =head2 Syntax and generated code
435 Normally, Perl subroutines are not in scope in their own body, meaning the
436 parser doesn't know the name C<foo> or its prototype while processing the body
437 of C<sub foo ($) { foo $bar[1], $bar[0]; }>, parsing it as
438 C<$bar-E<gt>foo([1], $bar[0])>. Yes. You can add parens to change the
439 interpretation of this code, but C<foo($bar[1], $bar[0])> will only trigger
440 a I<foo() called too early to check prototype> warning. This module attempts
441 to fix all of this by adding a subroutine declaration before the function body,
442 so the parser knows the name (and possibly prototype) while it processes the
443 body. Thus C<fun foo($x) :($) { $x }> really turns into
444 C<sub foo ($) { sub foo ($); my ($x) = @_; $x }>.
446 If you need L<subroutine attributes|perlsub/Subroutine-Attributes>, you can
447 put them after the parameter list with their usual syntax.
449 Syntactically, these new parameter lists live in the spot normally occupied
450 by L<prototypes|perlsub/"Prototypes">. However, you can include a prototype by
451 specifying it as the first attribute (this is syntactically unambiguous
452 because normal attributes have to start with a letter while a prototype starts
455 As an example, the following declaration uses every available feature
456 (subroutine name, parameter list, default arguments, prototype, default
457 attributes, attributes, argument count checks, and implicit C<$self>):
459 method foo($x, $y, $z = sqrt 5)
467 And here's what it turns into:
469 sub foo ($$$;$) :method :lvalue :Banana(2 + 2) {
471 Carp::croak "Not enough arguments for method foo" if @_ < 3;
472 Carp::croak "Too many arguments for method foo" if @_ > 4;
474 my ($x, $y, $z) = @_;
475 $z = sqrt 5 if @_ < 3;
481 my $coderef = fun ($p, $q)
488 And the generated code:
490 my $coderef = sub (;$$) :lvalue :Gazebo((>:O)) {
491 # vvv only if check_argument_count is enabled vvv
492 Carp::croak "Not enough arguments for fun (anon)" if @_ < 2;
493 Carp::croak "Too many arguments for fun (anon)" if @_ > 2;
499 =head2 Wrapping Function::Parameters
501 If you want to wrap L<Function::Parameters>, you just have to call its
502 C<import> method. It always applies to the file that is currently being parsed
503 and its effects are L<lexical|perlpragma> (i.e. it works like L<warnings> or
506 package Some::Wrapper;
507 use Function::Parameters ();
509 Function::Parameters->import;
510 # or Function::Parameters->import(@custom_import_args);
515 Lukas Mai, C<< <l.mai at web.de> >>
517 =head1 COPYRIGHT & LICENSE
519 Copyright 2010, 2011, 2012 Lukas Mai.
521 This program is free software; you can redistribute it and/or modify it
522 under the terms of either: the GNU General Public License as published
523 by the Free Software Foundation; or the Artistic License.
525 See http://dev.perl.org/licenses/ for more information.