Update CPANPLUS::Dist::Build to 0.20
[p5sagit/p5-mst-13.2.git] / lib / attributes.pm
CommitLineData
09bef843 1package attributes;
2
0a8c518d 3our $VERSION = 0.10;
09bef843 4
26f2972e 5@EXPORT_OK = qw(get reftype);
6@EXPORT = ();
7%EXPORT_TAGS = (ALL => [@EXPORT, @EXPORT_OK]);
09bef843 8
9use strict;
10
11sub croak {
12 require Carp;
13 goto &Carp::croak;
14}
15
16sub carp {
17 require Carp;
18 goto &Carp::carp;
19}
20
21## forward declaration(s) rather than wrapping the bootstrap call in BEGIN{}
22#sub reftype ($) ;
23#sub _fetch_attrs ($) ;
24#sub _guess_stash ($) ;
25#sub _modify_attrs ;
09bef843 26#
27# The extra trips through newATTRSUB in the interpreter wipe out any savings
28# from avoiding the BEGIN block. Just do the bootstrap now.
592f5969 29BEGIN { bootstrap attributes }
09bef843 30
31sub import {
26f2972e 32 @_ > 2 && ref $_[2] or do {
33 require Exporter;
34 goto &Exporter::import;
c0c5a66b 35 };
09bef843 36 my (undef,$home_stash,$svref,@attrs) = @_;
37
38 my $svtype = uc reftype($svref);
39 my $pkgmeth;
40 $pkgmeth = UNIVERSAL::can($home_stash, "MODIFY_${svtype}_ATTRIBUTES")
41 if defined $home_stash && $home_stash ne '';
42 my @badattrs;
43 if ($pkgmeth) {
44 my @pkgattrs = _modify_attrs($svref, @attrs);
d5adc3a1 45 @badattrs = $pkgmeth->($home_stash, $svref, @pkgattrs);
09bef843 46 if (!@badattrs && @pkgattrs) {
20f4e289 47 require warnings;
48 return unless warnings::enabled('reserved');
09bef843 49 @pkgattrs = grep { m/\A[[:lower:]]+(?:\z|\()/ } @pkgattrs;
50 if (@pkgattrs) {
51 for my $attr (@pkgattrs) {
52 $attr =~ s/\(.+\z//s;
53 }
54 my $s = ((@pkgattrs == 1) ? '' : 's');
55 carp "$svtype package attribute$s " .
56 "may clash with future reserved word$s: " .
0120eecf 57 join(' : ' , @pkgattrs);
09bef843 58 }
59 }
60 }
61 else {
62 @badattrs = _modify_attrs($svref, @attrs);
63 }
64 if (@badattrs) {
65 croak "Invalid $svtype attribute" .
66 (( @badattrs == 1 ) ? '' : 's') .
67 ": " .
0120eecf 68 join(' : ', @badattrs);
09bef843 69 }
70}
71
72sub get ($) {
73 @_ == 1 && ref $_[0] or
74 croak 'Usage: '.__PACKAGE__.'::get $ref';
75 my $svref = shift;
76 my $svtype = uc reftype $svref;
77 my $stash = _guess_stash $svref;
78 $stash = caller unless defined $stash;
79 my $pkgmeth;
80 $pkgmeth = UNIVERSAL::can($stash, "FETCH_${svtype}_ATTRIBUTES")
81 if defined $stash && $stash ne '';
82 return $pkgmeth ?
83 (_fetch_attrs($svref), $pkgmeth->($stash, $svref)) :
84 (_fetch_attrs($svref))
85 ;
86}
87
26f2972e 88sub require_version { goto &UNIVERSAL::VERSION }
09bef843 89
901;
91__END__
92#The POD goes here
93
94=head1 NAME
95
96attributes - get/set subroutine or variable attributes
97
98=head1 SYNOPSIS
99
100 sub foo : method ;
95f0a2f1 101 my ($x,@y,%z) : Bent = 1;
09bef843 102 my $s = sub : method { ... };
103
104 use attributes (); # optional, to get subroutine declarations
105 my @attrlist = attributes::get(\&foo);
106
26f2972e 107 use attributes 'get'; # import the attributes::get subroutine
108 my @attrlist = get \&foo;
109
09bef843 110=head1 DESCRIPTION
111
112Subroutine declarations and definitions may optionally have attribute lists
113associated with them. (Variable C<my> declarations also may, but see the
114warning below.) Perl handles these declarations by passing some information
115about the call site and the thing being declared along with the attribute
26f2972e 116list to this module. In particular, the first example above is equivalent to
09bef843 117the following:
118
119 use attributes __PACKAGE__, \&foo, 'method';
120
121The second example in the synopsis does something equivalent to this:
122
95f0a2f1 123 use attributes ();
124 my ($x,@y,%z);
125 attributes::->import(__PACKAGE__, \$x, 'Bent');
126 attributes::->import(__PACKAGE__, \@y, 'Bent');
127 attributes::->import(__PACKAGE__, \%z, 'Bent');
128 ($x,@y,%z) = 1;
09bef843 129
95f0a2f1 130Yes, that's a lot of expansion.
09bef843 131
1d2de774 132B<WARNING>: attribute declarations for variables are still evolving.
133The semantics and interfaces of such declarations could change in
134future versions. They are present for purposes of experimentation
09bef843 135with what the semantics ought to be. Do not rely on the current
95f0a2f1 136implementation of this feature.
09bef843 137
138There are only a few attributes currently handled by Perl itself (or
139directly by this module, depending on how you look at it.) However,
140package-specific attributes are allowed by an extension mechanism.
141(See L<"Package-specific Attribute Handling"> below.)
142
95f0a2f1 143The setting of subroutine attributes happens at compile time.
144Variable attributes in C<our> declarations are also applied at compile time.
145However, C<my> variables get their attributes applied at run-time.
146This means that you have to I<reach> the run-time component of the C<my>
147before those attributes will get applied. For example:
148
149 my $x : Bent = 42 if 0;
150
151will neither assign 42 to $x I<nor> will it apply the C<Bent> attribute
152to the variable.
153
1d2de774 154An attempt to set an unrecognized attribute is a fatal error. (The
155error is trappable, but it still stops the compilation within that
156C<eval>.) Setting an attribute with a name that's all lowercase
157letters that's not a built-in attribute (such as "foo") will result in
158a warning with B<-w> or C<use warnings 'reserved'>.
09bef843 159
a911a0f8 160=head2 What C<import> does
161
162In the description it is mentioned that
163
164 sub foo : method;
165
166is equivalent to
167
168 use attributes __PACKAGE__, \&foo, 'method';
169
170As you might know this calls the C<import> function of C<attributes> at compile
171time with these parameters: 'attributes', the caller's package name, the reference
172to the code and 'method'.
173
174 attributes->import( __PACKAGE__, \&foo, 'method' );
175
176So you want to know what C<import> actually does?
177
178First of all C<import> gets the type of the third parameter ('CODE' in this case).
179C<attributes.pm> checks if there is a subroutine called C<< MODIFY_<reftype>_ATTRIBUTES >>
180in the caller's namespace (here: 'main'). In this case a subroutine C<MODIFY_CODE_ATTRIBUTES> is
181required. Then this method is called to check if you have used a "bad attribute".
182The subroutine call in this example would look like
183
184 MODIFY_CODE_ATTRIBUTES( 'main', \&foo, 'method' );
185
186C<< MODIFY_<reftype>_ATTRIBUTES >> has to return a list of all "bad attributes".
187If there are any bad attributes C<import> croaks.
188
189(See L<"Package-specific Attribute Handling"> below.)
190
09bef843 191=head2 Built-in Attributes
192
193The following are the built-in attributes for subroutines:
194
195=over 4
196
0a8c518d 197=item lvalue
cef7f621 198
0a8c518d 199Indicates that the referenced subroutine is a valid lvalue and can
200be assigned to. The subroutine must return a modifiable value such
201as a scalar variable, as described in L<perlsub>.
09bef843 202
203=item method
204
0a8c518d 205Indicates that the referenced subroutine is a method. A subroutine so marked
09bef843 206will not trigger the "Ambiguous call resolved as CORE::%s" warning.
207
0a8c518d 208=item locked
89752b9c 209
0a8c518d 210The "locked" attribute has no effect in 5.10.0 and later. It was used as part
211of the now-removed "Perl 5.005 threads".
89752b9c 212
09bef843 213=back
214
307ea6df 215For global variables there is C<unique> attribute: see L<perlfunc/our>.
95f0a2f1 216
09bef843 217=head2 Available Subroutines
218
219The following subroutines are available for general use once this module
220has been loaded:
221
222=over 4
223
224=item get
225
226This routine expects a single parameter--a reference to a
227subroutine or variable. It returns a list of attributes, which may be
228empty. If passed invalid arguments, it uses die() (via L<Carp::croak|Carp>)
229to raise a fatal exception. If it can find an appropriate package name
230for a class method lookup, it will include the results from a
231C<FETCH_I<type>_ATTRIBUTES> call in its return list, as described in
26f2972e 232L<"Package-specific Attribute Handling"> below.
09bef843 233Otherwise, only L<built-in attributes|"Built-in Attributes"> will be returned.
234
235=item reftype
236
237This routine expects a single parameter--a reference to a subroutine or
238variable. It returns the built-in type of the referenced variable,
239ignoring any package into which it might have been blessed.
240This can be useful for determining the I<type> value which forms part of
26f2972e 241the method names described in L<"Package-specific Attribute Handling"> below.
09bef843 242
243=back
244
26f2972e 245Note that these routines are I<not> exported by default.
09bef843 246
247=head2 Package-specific Attribute Handling
248
249B<WARNING>: the mechanisms described here are still experimental. Do not
250rely on the current implementation. In particular, there is no provision
251for applying package attributes to 'cloned' copies of subroutines used as
252closures. (See L<perlref/"Making References"> for information on closures.)
253Package-specific attribute handling may change incompatibly in a future
254release.
255
256When an attribute list is present in a declaration, a check is made to see
257whether an attribute 'modify' handler is present in the appropriate package
258(or its @ISA inheritance tree). Similarly, when C<attributes::get> is
259called on a valid reference, a check is made for an appropriate attribute
260'fetch' handler. See L<"EXAMPLES"> to see how the "appropriate package"
261determination works.
262
263The handler names are based on the underlying type of the variable being
264declared or of the reference passed. Because these attributes are
265associated with subroutine or variable declarations, this deliberately
266ignores any possibility of being blessed into some package. Thus, a
267subroutine declaration uses "CODE" as its I<type>, and even a blessed
268hash reference uses "HASH" as its I<type>.
269
270The class methods invoked for modifying and fetching are these:
271
272=over 4
273
274=item FETCH_I<type>_ATTRIBUTES
275
630ad279 276This method is called with two arguments: the relevant package name,
277and a reference to a variable or subroutine for which package-defined
278attributes are desired. The expected return value is a list of
279associated attributes. This list may be empty.
09bef843 280
281=item MODIFY_I<type>_ATTRIBUTES
282
283This method is called with two fixed arguments, followed by the list of
284attributes from the relevant declaration. The two fixed arguments are
285the relevant package name and a reference to the declared subroutine or
fd40b977 286variable. The expected return value is a list of attributes which were
09bef843 287not recognized by this handler. Note that this allows for a derived class
288to delegate a call to its base class, and then only examine the attributes
289which the base class didn't already handle for it.
290
291The call to this method is currently made I<during> the processing of the
292declaration. In particular, this means that a subroutine reference will
293probably be for an undefined subroutine, even if this declaration is
294actually part of the definition.
295
296=back
297
298Calling C<attributes::get()> from within the scope of a null package
299declaration C<package ;> for an unblessed variable reference will
300not provide any starting package name for the 'fetch' method lookup.
301Thus, this circumstance will not result in a method call for package-defined
302attributes. A named subroutine knows to which symbol table entry it belongs
303(or originally belonged), and it will use the corresponding package.
304An anonymous subroutine knows the package name into which it was compiled
305(unless it was also compiled with a null package declaration), and so it
306will use that package name.
307
308=head2 Syntax of Attribute Lists
309
310An attribute list is a sequence of attribute specifications, separated by
0120eecf 311whitespace or a colon (with optional whitespace).
312Each attribute specification is a simple
09bef843 313name, optionally followed by a parenthesised parameter list.
314If such a parameter list is present, it is scanned past as for the rules
315for the C<q()> operator. (See L<perlop/"Quote and Quote-like Operators">.)
316The parameter list is passed as it was found, however, and not as per C<q()>.
317
318Some examples of syntactically valid attribute lists:
319
0120eecf 320 switch(10,foo(7,3)) : expensive
321 Ugly('\(") :Bad
09bef843 322 _5x5
323 locked method
324
325Some examples of syntactically invalid attribute lists (with annotation):
326
327 switch(10,foo() # ()-string not balanced
328 Ugly('(') # ()-string not balanced
329 5x5 # "5x5" not a valid identifier
330 Y2::north # "Y2::north" not a simple identifier
0120eecf 331 foo + bar # "+" neither a colon nor whitespace
09bef843 332
26f2972e 333=head1 EXPORTS
334
335=head2 Default exports
336
337None.
338
339=head2 Available exports
340
341The routines C<get> and C<reftype> are exportable.
342
343=head2 Export tags defined
344
345The C<:ALL> tag will get all of the above exports.
346
09bef843 347=head1 EXAMPLES
348
349Here are some samples of syntactically valid declarations, with annotation
350as to how they resolve internally into C<use attributes> invocations by
351perl. These examples are primarily useful to see how the "appropriate
352package" is found for the possible method lookups for package-defined
353attributes.
354
355=over 4
356
357=item 1.
358
359Code:
360
361 package Canine;
362 package Dog;
363 my Canine $spot : Watchful ;
364
365Effect:
366
95f0a2f1 367 use attributes ();
368 attributes::->import(Canine => \$spot, "Watchful");
09bef843 369
370=item 2.
371
372Code:
373
374 package Felis;
375 my $cat : Nervous;
376
377Effect:
378
95f0a2f1 379 use attributes ();
380 attributes::->import(Felis => \$cat, "Nervous");
09bef843 381
382=item 3.
383
384Code:
385
386 package X;
387 sub foo : locked ;
388
389Effect:
390
391 use attributes X => \&foo, "locked";
392
393=item 4.
394
395Code:
396
397 package X;
398 sub Y::x : locked { 1 }
399
400Effect:
401
402 use attributes Y => \&Y::x, "locked";
403
404=item 5.
405
406Code:
407
408 package X;
409 sub foo { 1 }
410
411 package Y;
412 BEGIN { *bar = \&X::foo; }
413
414 package Z;
415 sub Y::bar : locked ;
416
417Effect:
418
419 use attributes X => \&X::foo, "locked";
420
421=back
422
423This last example is purely for purposes of completeness. You should not
424be trying to mess with the attributes of something in a package that's
425not your own.
426
a911a0f8 427=head1 MORE EXAMPLES
428
429=over 4
430
431=item 1.
432
433 sub MODIFY_CODE_ATTRIBUTES {
434 my ($class,$code,@attrs) = @_;
435
436 my $allowed = 'MyAttribute';
437 my @bad = grep { $_ ne $allowed } @attrs;
438
439 return @bad;
440 }
441
442 sub foo : MyAttribute {
443 print "foo\n";
444 }
445
446This example runs. At compile time C<MODIFY_CODE_ATTRIBUTES> is called. In that
447subroutine, we check if any attribute is disallowed and we return a list of
448these "bad attributes".
449
450As we return an empty list, everything is fine.
451
452=item 2.
453
454 sub MODIFY_CODE_ATTRIBUTES {
455 my ($class,$code,@attrs) = @_;
456
457 my $allowed = 'MyAttribute';
458 my @bad = grep{ $_ ne $allowed }@attrs;
459
460 return @bad;
461 }
462
463 sub foo : MyAttribute Test {
464 print "foo\n";
465 }
466
467This example is aborted at compile time as we use the attribute "Test" which
468isn't allowed. C<MODIFY_CODE_ATTRIBUTES> returns a list that contains a single
469element ('Test').
470
471=back
472
09bef843 473=head1 SEE ALSO
474
475L<perlsub/"Private Variables via my()"> and
476L<perlsub/"Subroutine Attributes"> for details on the basic declarations;
477L<attrs> for the obsolescent form of subroutine attribute specification
478which this module replaces;
479L<perlfunc/use> for details on the normal invocation mechanism.
480
481=cut
482