diff options
author | Spider Boardman <spider@orb.nashua.nh.us> | 2001-12-08 19:09:23 -0500 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2001-12-09 15:00:50 +0000 |
commit | 95f0a2f1ffc68ef908768ec5d39e4102afd28c1e (patch) | |
tree | 6d6c7cf9004e0c6dae9629f09bab6144eeec3347 /lib | |
parent | 5ec554fbe2d22a7213ac94890d84ed925ba9af4b (diff) | |
download | perl-95f0a2f1ffc68ef908768ec5d39e4102afd28c1e.tar.gz |
Re: attributes are broken
Message-Id: <200112090509.AAA02053@Orb.Nashua.NH.US>
p4raw-id: //depot/perl@13543
Diffstat (limited to 'lib')
-rw-r--r-- | lib/attributes.pm | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/lib/attributes.pm b/lib/attributes.pm index 3a6b3d5e0f..4f6eef0376 100644 --- a/lib/attributes.pm +++ b/lib/attributes.pm @@ -1,6 +1,6 @@ package attributes; -our $VERSION = 0.04; +our $VERSION = '0.04_01'; @EXPORT_OK = qw(get reftype); @EXPORT = (); @@ -98,7 +98,7 @@ attributes - get/set subroutine or variable attributes =head1 SYNOPSIS sub foo : method ; - my ($x,@y,%z) : Bent ; + my ($x,@y,%z) : Bent = 1; my $s = sub : method { ... }; use attributes (); # optional, to get subroutine declarations @@ -120,25 +120,38 @@ the following: The second example in the synopsis does something equivalent to this: - use attributes __PACKAGE__, \$x, 'Bent'; - use attributes __PACKAGE__, \@y, 'Bent'; - use attributes __PACKAGE__, \%z, 'Bent'; + use attributes (); + my ($x,@y,%z); + attributes::->import(__PACKAGE__, \$x, 'Bent'); + attributes::->import(__PACKAGE__, \@y, 'Bent'); + attributes::->import(__PACKAGE__, \%z, 'Bent'); + ($x,@y,%z) = 1; -Yes, that's three invocations. +Yes, that's a lot of expansion. B<WARNING>: attribute declarations for variables are an I<experimental> feature. The semantics of such declarations could change or be removed in future versions. They are present for purposes of experimentation with what the semantics ought to be. Do not rely on the current -implementation of this feature. Variable attributes are currently -not usable for tieing. +implementation of this feature. There are only a few attributes currently handled by Perl itself (or directly by this module, depending on how you look at it.) However, package-specific attributes are allowed by an extension mechanism. (See L<"Package-specific Attribute Handling"> below.) -The setting of attributes happens at compile time. An attempt to set +The setting of subroutine attributes happens at compile time. +Variable attributes in C<our> declarations are also applied at compile time. +However, C<my> variables get their attributes applied at run-time. +This means that you have to I<reach> the run-time component of the C<my> +before those attributes will get applied. For example: + + my $x : Bent = 42 if 0; + +will neither assign 42 to $x I<nor> will it apply the C<Bent> attribute +to the variable. + +An attempt to set an unrecognized attribute is a fatal error. (The error is trappable, but it still stops the compilation within that C<eval>.) Setting an attribute with a name that's all lowercase letters that's not a built-in attribute @@ -180,6 +193,9 @@ as a scalar variable, as described in L<perlsub>. There are no built-in attributes for anything other than subroutines. +=for hackers +What about C<unique>? + =head2 Available Subroutines The following subroutines are available for general use once this module @@ -330,7 +346,8 @@ Code: Effect: - use attributes Canine => \$spot, "Watchful"; + use attributes (); + attributes::->import(Canine => \$spot, "Watchful"); =item 2. @@ -341,7 +358,8 @@ Code: Effect: - use attributes Felis => \$cat, "Nervous"; + use attributes (); + attributes::->import(Felis => \$cat, "Nervous"); =item 3. |