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