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