fix broken links in POD
[p5sagit/Function-Parameters.git] / lib / Function / Parameters.pm
CommitLineData
7a63380c 1package Function::Parameters;
2
7dd35535 3use v5.14.0;
4
7a63380c 5use strict;
6use warnings;
7
63915d26 8use Carp qw(confess);
9
db81d362 10use XSLoader;
11BEGIN {
1d143321 12 our $VERSION = '0.06';
db81d362 13 XSLoader::load;
7a63380c 14}
15
2d5cf47a 16sub _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};
21}
22
b72eb6ee 23sub _assert_valid_attributes {
24 my ($attrs) = @_;
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};
27}
28
125c067e 29my @bare_arms = qw(function method);
2d5cf47a 30my %type_map = (
63915d26 31 function => {
32 name => 'optional',
33 default_arguments => 1,
34 check_argument_count => 0,
35 },
7947f7ce 36 method => {
37 name => 'optional',
63915d26 38 default_arguments => 1,
39 check_argument_count => 0,
7947f7ce 40 attrs => ':method',
63915d26 41 shift => '$self',
7947f7ce 42 },
a23979e1 43 classmethod => {
44 name => 'optional',
63915d26 45 default_arguments => 1,
46 check_argument_count => 0,
698e861c 47 attributes => ':method',
63915d26 48 shift => '$class',
a23979e1 49 },
2d5cf47a 50);
c9a39f6b 51
db81d362 52sub import {
53 my $class = shift;
7a63380c 54
b72eb6ee 55 @_ or @_ = {
56 fun => 'function',
57 method => 'method',
58 };
125c067e 59 if (@_ == 1 && ref($_[0]) eq 'HASH') {
60 @_ = map [$_, $_[0]{$_}], keys %{$_[0]}
61 or return;
62 }
7a63380c 63
125c067e 64 my %spec;
65
66 my $bare = 0;
67 for my $proto (@_) {
68 my $item = ref $proto
69 ? $proto
70 : [$proto, $bare_arms[$bare++] || confess(qq{Don't know what to do with "$proto"})]
71 ;
ae6e00b5 72 my ($name, $proto_type) = @$item;
2d5cf47a 73 _assert_valid_identifier $name;
74
ae6e00b5 75 unless (ref $proto_type) {
76 # use '||' instead of 'or' to preserve $proto_type in the error message
77 $proto_type = $type_map{$proto_type}
78 || confess qq["$proto_type" doesn't look like a valid type (one of ${\join ', ', sort keys %type_map})];
2d5cf47a 79 }
b72eb6ee 80
ae6e00b5 81 my %type = %$proto_type;
82 my %clean;
10acc8b1 83
ae6e00b5 84 $clean{name} = delete $type{name} || 'optional';
85 $clean{name} =~ /^(?:optional|required|prohibited)\z/
86 or confess qq["$clean{name}" doesn't look like a valid name attribute (one of optional, required, prohibited)];
10acc8b1 87
ae6e00b5 88 $clean{shift} = delete $type{shift} || '';
10acc8b1 89 _assert_valid_identifier $clean{shift}, 1 if $clean{shift};
90
698e861c 91 $clean{attrs} = join ' ', map delete $type{$_} || (), qw(attributes attrs);
10acc8b1 92 _assert_valid_attributes $clean{attrs} if $clean{attrs};
125c067e 93
59f51b8b 94 $clean{default_arguments} =
95 exists $type{default_arguments}
96 ? !!delete $type{default_arguments}
97 : 1
98 ;
63915d26 99 $clean{check_argument_count} = !!delete $type{check_argument_count};
100
ae6e00b5 101 %type and confess "Invalid keyword property: @{[keys %type]}";
102
103 $spec{$name} = \%clean;
125c067e 104 }
105
db81d362 106 for my $kw (keys %spec) {
107 my $type = $spec{$kw};
108
63915d26 109 my $flags =
110 $type->{name} eq 'prohibited' ? FLAG_ANON_OK :
111 $type->{name} eq 'required' ? FLAG_NAME_OK :
112 FLAG_ANON_OK | FLAG_NAME_OK
113 ;
114 $flags |= FLAG_DEFAULT_ARGS if $type->{default_arguments};
115 $flags |= FLAG_CHECK_NARGS if $type->{check_argument_count};
116 $^H{HINTK_FLAGS_ . $kw} = $flags;
ae6e00b5 117 $^H{HINTK_SHIFT_ . $kw} = $type->{shift};
10acc8b1 118 $^H{HINTK_ATTRS_ . $kw} = $type->{attrs};
db81d362 119 $^H{+HINTK_KEYWORDS} .= "$kw ";
125c067e 120 }
eeb7df5f 121}
122
db81d362 123sub unimport {
eeb7df5f 124 my $class = shift;
125c067e 125
db81d362 126 if (!@_) {
127 delete $^H{+HINTK_KEYWORDS};
125c067e 128 return;
129 }
130
db81d362 131 for my $kw (@_) {
132 $^H{+HINTK_KEYWORDS} =~ s/(?<![^ ])\Q$kw\E //g;
125c067e 133 }
134}
135
db81d362 136
125c067e 137'ok'
7a63380c 138
139__END__
140
f2541b7d 141=encoding UTF-8
142
7a63380c 143=head1 NAME
144
145Function::Parameters - subroutine definitions with parameter lists
146
147=head1 SYNOPSIS
148
149 use Function::Parameters;
150
698e861c 151 # simple function
7a63380c 152 fun foo($bar, $baz) {
153 return $bar + $baz;
154 }
155
698e861c 156 # function with prototype
7a63380c 157 fun mymap($fun, @args) :(&@) {
158 my @res;
159 for (@args) {
160 push @res, $fun->($_);
161 }
162 @res
163 }
164
165 print "$_\n" for mymap { $_ * 2 } 1 .. 4;
125c067e 166
698e861c 167 # method with implicit $self
125c067e 168 method set_name($name) {
169 $self->{name} = $name;
170 }
7a63380c 171
698e861c 172 # function with default arguments
173 fun search($haystack, $needle = qr/^(?!)/, $offset = 0) {
174 ...
175 }
176
177 # method with default arguments
178 method skip($amount = 1) {
179 $self->{position} += $amount;
180 }
181
125c067e 182=cut
183
184=pod
185
698e861c 186 # use different keywords
63a24d7c 187 use Function::Parameters {
188 proc => 'function',
189 meth => 'method',
190 };
c9a39f6b 191
125c067e 192 my $f = proc ($x) { $x * 2 };
193 meth get_age() {
194 return $self->{age};
195 }
196
7a63380c 197=head1 DESCRIPTION
198
199This module lets you use parameter lists in your subroutines. Thanks to
63a24d7c 200L<PL_keyword_plugin|perlapi/PL_keyword_plugin> it works without source filters.
7a63380c 201
db81d362 202WARNING: This is my first attempt at writing L<XS code|perlxs> and I have
7a63380c 203almost no experience with perl's internals. So while this module might
204appear to work, it could also conceivably make your programs segfault.
205Consider this module alpha quality.
206
207=head2 Basic stuff
208
209To use this new functionality, you have to use C<fun> instead of C<sub> -
210C<sub> continues to work as before. The syntax is almost the same as for
211C<sub>, but after the subroutine name (or directly after C<fun> if you're
125c067e 212writing an anonymous sub) you can write a parameter list in parentheses. This
7a63380c 213list consists of comma-separated variables.
214
215The effect of C<fun foo($bar, $baz) {> is as if you'd written
216C<sub foo { my ($bar, $baz) = @_; >, i.e. the parameter list is simply
95915793 217copied into L<my|perlfunc/my-EXPR> and initialized from L<@_|perlvar/"@_">.
7a63380c 218
125c067e 219In addition you can use C<method>, which understands the same syntax as C<fun>
220but automatically creates a C<$self> variable for you. So by writing
221C<method foo($bar, $baz) {> you get the same effect as
222C<sub foo { my $self = shift; my ($bar, $baz) = @_; >.
7a63380c 223
125c067e 224=head2 Customizing the generated keywords
c9a39f6b 225
63a24d7c 226You can customize the names of the keywords injected into your scope. To do
698e861c 227that you pass a reference to a hash mapping keywords to types in the import
228list:
229
230 use Function::Parameters {
231 KEYWORD1 => TYPE1,
232 KEYWORD2 => TYPE2,
233 ...
234 };
235
236Or more concretely:
7a63380c 237
125c067e 238 use Function::Parameters { proc => 'function', meth => 'method' }; # -or-
239 use Function::Parameters { proc => 'function' }; # -or-
a23979e1 240 use Function::Parameters { meth => 'method' }; # etc.
125c067e 241
242The first line creates two keywords, C<proc> and C<meth> (for defining
243functions and methods, respectively). The last two lines only create one
698e861c 244keyword. Generally the hash keys (keywords) can be any identifiers you want
245while the values (types) have to be either C<'function'>, C<'method'>,
246C<'classmethod'>, or a hash reference (see below). The main difference between
247C<'function'> and C<'method'> is that C<'method'>s automatically
248L<shift|perlfunc/shift> their first argument into C<$self> (C<'classmethod'>s
249are similar but shift into C<$class>).
125c067e 250
251The following shortcuts are available:
252
253 use Function::Parameters;
254 # is equivalent to #
255 use Function::Parameters { fun => 'function', method => 'method' };
256
257=cut
258
259=pod
260
63a24d7c 261The following shortcuts are deprecated and may be removed from a future version
698e861c 262of this module:
63a24d7c 263
264 # DEPRECATED
125c067e 265 use Function::Parameters 'foo';
266 # is equivalent to #
267 use Function::Parameters { 'foo' => 'function' };
268
269=cut
270
271=pod
272
63a24d7c 273 # DEPRECATED
125c067e 274 use Function::Parameters 'foo', 'bar';
275 # is equivalent to #
276 use Function::Parameters { 'foo' => 'function', 'bar' => 'method' };
277
63a24d7c 278That is, if you want to pass arguments to L<Function::Parameters>, use a
279hashref, not a list of strings.
280
698e861c 281You can customize the properties of the generated keywords even more by passing
282a hashref instead of a string. This hash can have the following keys:
ce052c57 283
284=over
285
286=item C<name>
287
288Valid values: C<optional> (default), C<required> (all uses of this keyword must
289specify a function name), and C<prohibited> (all uses of this keyword must not
290specify a function name). This means a C<< name => 'prohibited' >> keyword can
291only be used for defining anonymous functions.
292
293=item C<shift>
294
295Valid values: strings that look like a scalar variable. Any function created by
296this keyword will automatically L<shift|perlfunc/shift> its first argument into
63a24d7c 297a local variable whose name is specified here.
ce052c57 298
698e861c 299=item C<attributes>, C<attrs>
273c6544 300
301Valid values: strings that are valid source code for attributes. Any value
302specified here will be inserted as a subroutine attribute in the generated
303code. Thus:
304
698e861c 305 use Function::Parameters { sub_l => { attributes => ':lvalue' } };
273c6544 306 sub_l foo() {
307 ...
308 }
309
310turns into
311
312 sub foo :lvalue {
313 ...
314 }
315
698e861c 316It is recommended that you use C<attributes> in new code but C<attrs> is also
317accepted for now.
318
319=item C<default_arguments>
320
321Valid values: booleans. This property is on by default, so you have to pass
322C<< default_arguments => 0 >> to turn it off. If it is disabled, using C<=> in
323a parameter list causes a syntax error. Otherwise it lets you specify
324default arguments directly in the parameter list:
325
326 fun foo($x, $y = 42, $z = []) {
327 ...
328 }
329
330turns into
331
332 sub foo {
333 my ($x, $y, $z) = @_;
334 $y = 42 if @_ < 2;
335 $z = [] if @_ < 3;
336 ...
337 }
338
339except that none of the parameters are in scope in the expressions that specify
340default values. Thus:
341
342 my $var = "outer";
343
344 fun foo($var, $wat = $var) {
345 # $wat will default to "outer", not to what was passed
346 # as the first argument!
347 ...
348 }
349
350This may change in a future version of this module.
351
352=item C<check_argument_count>
353
354Valid values: booleans. This property is off by default. If it is enabled, the
355generated code will include checks to make sure the number of passed arguments
356is correct (and otherwise throw an exception via L<Carp::croak|Carp>):
357
358 fun foo($x, $y = 42, $z = []) {
359 ...
360 }
361
362turns into
363
364 sub foo {
365 Carp::croak "Not enough arguments for fun foo" if @_ < 1;
366 Carp::croak "Too many arguments for fun foo" if @_ > 3;
367 my ($x, $y, $z) = @_;
368 $y = 42 if @_ < 2;
369 $z = [] if @_ < 3;
370 ...
371 }
372
ce052c57 373=back
374
698e861c 375Plain C<'function'> is equivalent to:
376
377 {
378 name => 'optional',
379 default_arguments => 1,
380 check_argument_count => 0,
381 }
382
383(These are all default values so C<'function'> is also equivalent to C<{}>.)
384
385C<'method'> is equivalent to:
386
387 {
388 name => 'optional',
389 default_arguments => 1,
390 check_argument_count => 0,
391 attributes => ':method',
392 shift => '$self',
393 }
394
395C<'classmethod'> is equivalent to:
396
397 {
398 name => 'optional',
399 default_arguments => 1,
400 check_argument_count => 0,
401 attributes => ':method',
402 shift => '$class',
403 }
ce052c57 404
63a24d7c 405=head2 Syntax and generated code
7a63380c 406
407Normally, Perl subroutines are not in scope in their own body, meaning the
63a24d7c 408parser doesn't know the name C<foo> or its prototype while processing the body
409of C<sub foo ($) { foo $bar[1], $bar[0]; }>, parsing it as
7a63380c 410C<$bar-E<gt>foo([1], $bar[0])>. Yes. You can add parens to change the
411interpretation of this code, but C<foo($bar[1], $bar[0])> will only trigger
412a I<foo() called too early to check prototype> warning. This module attempts
698e861c 413to fix all of this by adding a subroutine declaration before the function body,
7a63380c 414so the parser knows the name (and possibly prototype) while it processes the
415body. Thus C<fun foo($x) :($) { $x }> really turns into
698e861c 416C<sub foo ($) { sub foo ($); my ($x) = @_; $x }>.
7a63380c 417
95915793 418If you need L<subroutine attributes|perlsub/Subroutine-Attributes>, you can
125c067e 419put them after the parameter list with their usual syntax.
420
421Syntactically, these new parameter lists live in the spot normally occupied
422by L<prototypes|perlsub/"Prototypes">. However, you can include a prototype by
423specifying it as the first attribute (this is syntactically unambiguous
63a24d7c 424because normal attributes have to start with a letter while a prototype starts
425with C<(>).
426
698e861c 427As an example, the following declaration uses every available feature
428(subroutine name, parameter list, default arguments, prototype, default
429attributes, attributes, argument count checks, and implicit C<$self>):
63a24d7c 430
698e861c 431 method foo($x, $y, $z = sqrt 5) :($$$;$) :lvalue :Banana(2 + 2) {
63a24d7c 432 ...
433 }
434
435And here's what it turns into:
436
698e861c 437 sub foo ($$$;$) :method :lvalue :Banana(2 + 2) {
438 sub foo ($$$;$);
439 Carp::croak "Not enough arguments for method foo" if @_ < 2;
440 Carp::croak "Too many arguments for method foo" if @_ > 4;
441 my $self = shift;
442 my ($x, $y, $z) = @_;
443 $z = sqrt 5 if @_ < 3;
63a24d7c 444 ...
445 }
446
447Another example:
448
449 my $coderef = fun ($p, $q) :(;$$)
450 :lvalue
451 :Gazebo((>:O)) {
452 ...
453 };
454
455And the generated code:
456
698e861c 457 my $coderef = sub (;$$) :lvalue :Gazebo((>:O)) {
458 # vvv only if check_argument_count is enabled vvv
459 Carp::croak "Not enough arguments for fun (anon)" if @_ < 2;
460 Carp::croak "Too many arguments for fun (anon)" if @_ > 2;
461 my ($p, $q) = @_;
63a24d7c 462 ...
463 };
464
465=head2 Wrapping Function::Parameters
125c067e 466
db81d362 467If you want to wrap L<Function::Parameters>, you just have to call its
468C<import> method. It always applies to the file that is currently being parsed
95915793 469and its effects are L<lexical|perlpragma> (i.e. it works like L<warnings> or
470L<strict>).
63a24d7c 471
472 package Some::Wrapper;
473 use Function::Parameters ();
474 sub import {
475 Function::Parameters->import;
698e861c 476 # or Function::Parameters->import(@custom_import_args);
63a24d7c 477 }
eeb7df5f 478
7a63380c 479=head1 AUTHOR
480
481Lukas Mai, C<< <l.mai at web.de> >>
482
483=head1 COPYRIGHT & LICENSE
484
db81d362 485Copyright 2010, 2011, 2012 Lukas Mai.
7a63380c 486
487This program is free software; you can redistribute it and/or modify it
488under the terms of either: the GNU General Public License as published
489by the Free Software Foundation; or the Artistic License.
490
491See http://dev.perl.org/licenses/ for more information.
492
493=cut