diff options
author | reneeb <unknown> | 2008-05-25 00:30:37 -0700 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2008-06-01 20:22:24 +0000 |
commit | a911a0f814659baf7ad899d80524ba7e1a1c1625 (patch) | |
tree | 891a8e4221f2d1620e40a8c748b5239d49d59580 /lib | |
parent | 6f86311fbdd3b75e40d98b74ffba510124459a75 (diff) | |
download | perl-a911a0f814659baf7ad899d80524ba7e1a1c1625.tar.gz |
[perl #36516] attributes.pm documentation is recursive and incomplete
From: "reneeb via RT" <perlbug-followup@perl.org>
Message-ID: <rt-3.6.HEAD-19826-1211725834-911.36516-15-0@perl.org>
with some spelling nits
p4raw-id: //depot/perl@33985
Diffstat (limited to 'lib')
-rw-r--r-- | lib/attributes.pm | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/attributes.pm b/lib/attributes.pm index 22afaef3f4..db4a4714f7 100644 --- a/lib/attributes.pm +++ b/lib/attributes.pm @@ -157,6 +157,37 @@ C<eval>.) Setting an attribute with a name that's all lowercase letters that's not a built-in attribute (such as "foo") will result in a warning with B<-w> or C<use warnings 'reserved'>. +=head2 What C<import> does + +In the description it is mentioned that + + sub foo : method; + +is equivalent to + + use attributes __PACKAGE__, \&foo, 'method'; + +As you might know this calls the C<import> function of C<attributes> at compile +time with these parameters: 'attributes', the caller's package name, the reference +to the code and 'method'. + + attributes->import( __PACKAGE__, \&foo, 'method' ); + +So you want to know what C<import> actually does? + +First of all C<import> gets the type of the third parameter ('CODE' in this case). +C<attributes.pm> checks if there is a subroutine called C<< MODIFY_<reftype>_ATTRIBUTES >> +in the caller's namespace (here: 'main'). In this case a subroutine C<MODIFY_CODE_ATTRIBUTES> is +required. Then this method is called to check if you have used a "bad attribute". +The subroutine call in this example would look like + + MODIFY_CODE_ATTRIBUTES( 'main', \&foo, 'method' ); + +C<< MODIFY_<reftype>_ATTRIBUTES >> has to return a list of all "bad attributes". +If there are any bad attributes C<import> croaks. + +(See L<"Package-specific Attribute Handling"> below.) + =head2 Built-in Attributes The following are the built-in attributes for subroutines: @@ -406,6 +437,52 @@ This last example is purely for purposes of completeness. You should not be trying to mess with the attributes of something in a package that's not your own. +=head1 MORE EXAMPLES + +=over 4 + +=item 1. + + sub MODIFY_CODE_ATTRIBUTES { + my ($class,$code,@attrs) = @_; + + my $allowed = 'MyAttribute'; + my @bad = grep { $_ ne $allowed } @attrs; + + return @bad; + } + + sub foo : MyAttribute { + print "foo\n"; + } + +This example runs. At compile time C<MODIFY_CODE_ATTRIBUTES> is called. In that +subroutine, we check if any attribute is disallowed and we return a list of +these "bad attributes". + +As we return an empty list, everything is fine. + +=item 2. + + sub MODIFY_CODE_ATTRIBUTES { + my ($class,$code,@attrs) = @_; + + my $allowed = 'MyAttribute'; + my @bad = grep{ $_ ne $allowed }@attrs; + + return @bad; + } + + sub foo : MyAttribute Test { + print "foo\n"; + } + +This example is aborted at compile time as we use the attribute "Test" which +isn't allowed. C<MODIFY_CODE_ATTRIBUTES> returns a list that contains a single +element ('Test'). + +=back + =head1 SEE ALSO L<perlsub/"Private Variables via my()"> and |