summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/attributes.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/attributes.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/attributes.3pm468
1 files changed, 468 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/attributes.3pm b/upstream/mageia-cauldron/man3pm/attributes.3pm
new file mode 100644
index 00000000..ed2fd670
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/attributes.3pm
@@ -0,0 +1,468 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "attributes 3pm"
+.TH attributes 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+attributes \- get/set subroutine or variable attributes
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 3
+\& sub foo : method ;
+\& my ($x,@y,%z) : Bent = 1;
+\& my $s = sub : method { ... };
+\&
+\& use attributes (); # optional, to get subroutine declarations
+\& my @attrlist = attributes::get(\e&foo);
+\&
+\& use attributes \*(Aqget\*(Aq; # import the attributes::get subroutine
+\& my @attrlist = get \e&foo;
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+Subroutine declarations and definitions may optionally have attribute lists
+associated with them. (Variable \f(CW\*(C`my\*(C'\fR declarations also may, but see the
+warning below.) Perl handles these declarations by passing some information
+about the call site and the thing being declared along with the attribute
+list to this module. In particular, the first example above is equivalent to
+the following:
+.PP
+.Vb 1
+\& use attributes _\|_PACKAGE_\|_, \e&foo, \*(Aqmethod\*(Aq;
+.Ve
+.PP
+The second example in the synopsis does something equivalent to this:
+.PP
+.Vb 6
+\& use attributes ();
+\& my ($x,@y,%z);
+\& attributes::\->import(_\|_PACKAGE_\|_, \e$x, \*(AqBent\*(Aq);
+\& attributes::\->import(_\|_PACKAGE_\|_, \e@y, \*(AqBent\*(Aq);
+\& attributes::\->import(_\|_PACKAGE_\|_, \e%z, \*(AqBent\*(Aq);
+\& ($x,@y,%z) = 1;
+.Ve
+.PP
+Yes, that's a lot of expansion.
+.PP
+\&\fBWARNING\fR: attribute declarations for variables are still evolving.
+The semantics and interfaces of such declarations could change 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.
+.PP
+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 "Package-specific Attribute Handling" below.)
+.PP
+The setting of subroutine attributes happens at compile time.
+Variable attributes in \f(CW\*(C`our\*(C'\fR declarations are also applied at compile time.
+However, \f(CW\*(C`my\*(C'\fR variables get their attributes applied at run-time.
+This means that you have to \fIreach\fR the run-time component of the \f(CW\*(C`my\*(C'\fR
+before those attributes will get applied. For example:
+.PP
+.Vb 1
+\& my $x : Bent = 42 if 0;
+.Ve
+.PP
+will neither assign 42 to \f(CW$x\fR \fInor\fR will it apply the \f(CW\*(C`Bent\*(C'\fR attribute
+to the variable.
+.PP
+An attempt to set an unrecognized attribute is a fatal error. (The
+error is trappable, but it still stops the compilation within that
+\&\f(CW\*(C`eval\*(C'\fR.) 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 \fB\-w\fR or \f(CW\*(C`use warnings \*(Aqreserved\*(Aq\*(C'\fR.
+.ie n .SS "What ""import"" does"
+.el .SS "What \f(CWimport\fP does"
+.IX Subsection "What import does"
+In the description it is mentioned that
+.PP
+.Vb 1
+\& sub foo : method;
+.Ve
+.PP
+is equivalent to
+.PP
+.Vb 1
+\& use attributes _\|_PACKAGE_\|_, \e&foo, \*(Aqmethod\*(Aq;
+.Ve
+.PP
+As you might know this calls the \f(CW\*(C`import\*(C'\fR function of \f(CW\*(C`attributes\*(C'\fR at compile
+time with these parameters: 'attributes', the caller's package name, the reference
+to the code and 'method'.
+.PP
+.Vb 1
+\& attributes\->import( _\|_PACKAGE_\|_, \e&foo, \*(Aqmethod\*(Aq );
+.Ve
+.PP
+So you want to know what \f(CW\*(C`import\*(C'\fR actually does?
+.PP
+First of all \f(CW\*(C`import\*(C'\fR gets the type of the third parameter ('CODE' in this case).
+\&\f(CW\*(C`attributes.pm\*(C'\fR checks if there is a subroutine called \f(CW\*(C`MODIFY_<reftype>_ATTRIBUTES\*(C'\fR
+in the caller's namespace (here: 'main'). In this case a
+subroutine \f(CW\*(C`MODIFY_CODE_ATTRIBUTES\*(C'\fR 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
+.PP
+.Vb 1
+\& MODIFY_CODE_ATTRIBUTES( \*(Aqmain\*(Aq, \e&foo, \*(Aqmethod\*(Aq );
+.Ve
+.PP
+\&\f(CW\*(C`MODIFY_<reftype>_ATTRIBUTES\*(C'\fR has to return a list of all "bad attributes".
+If there are any bad attributes \f(CW\*(C`import\*(C'\fR croaks.
+.PP
+(See "Package-specific Attribute Handling" below.)
+.SS "Built-in Attributes"
+.IX Subsection "Built-in Attributes"
+The following are the built-in attributes for subroutines:
+.IP lvalue 4
+.IX Item "lvalue"
+Indicates that the referenced subroutine is a valid lvalue and can
+be assigned to. The subroutine must return a modifiable value such
+as a scalar variable, as described in perlsub.
+.Sp
+This module allows one to set this attribute on a subroutine that is
+already defined. For Perl subroutines (XSUBs are fine), it may or may not
+do what you want, depending on the code inside the subroutine, with details
+subject to change in future Perl versions. You may run into problems with
+lvalue context not being propagated properly into the subroutine, or maybe
+even assertion failures. For this reason, a warning is emitted if warnings
+are enabled. In other words, you should only do this if you really know
+what you are doing. You have been warned.
+.IP method 4
+.IX Item "method"
+Indicates that the referenced subroutine
+is a method. A subroutine so marked
+will not trigger the "Ambiguous call resolved as CORE::%s" warning.
+.IP prototype(..) 4
+.IX Item "prototype(..)"
+The "prototype" attribute is an alternate means of specifying a prototype
+on a sub. The desired prototype is within the parens.
+.Sp
+The prototype from the attribute is assigned to the sub immediately after
+the prototype from the sub, which means that if both are declared at the
+same time, the traditionally defined prototype is ignored. In other words,
+\&\f(CW\*(C`sub foo($$) : prototype(@) {}\*(C'\fR is indistinguishable from \f(CW\*(C`sub foo(@){}\*(C'\fR.
+.Sp
+If illegalproto warnings are enabled, the prototype declared inside this
+attribute will be sanity checked at compile time.
+.IP const 4
+.IX Item "const"
+This experimental attribute, introduced in Perl 5.22, only applies to
+anonymous subroutines. It causes the subroutine to be called as soon as
+the \f(CW\*(C`sub\*(C'\fR expression is evaluated. The return value is captured and
+turned into a constant subroutine.
+.PP
+The following are the built-in attributes for variables:
+.IP shared 4
+.IX Item "shared"
+Indicates that the referenced variable can be shared across different threads
+when used in conjunction with the threads and threads::shared modules.
+.SS "Available Subroutines"
+.IX Subsection "Available Subroutines"
+The following subroutines are available for general use once this module
+has been loaded:
+.IP get 4
+.IX Item "get"
+This routine expects a single parameter\-\-a reference to a
+subroutine or variable. It returns a list of attributes, which may be
+empty. If passed invalid arguments, it uses \fBdie()\fR (via Carp::croak)
+to raise a fatal exception. If it can find an appropriate package name
+for a class method lookup, it will include the results from a
+\&\f(CW\*(C`FETCH_\fR\f(CItype\fR\f(CW_ATTRIBUTES\*(C'\fR call in its return list, as described in
+"Package-specific Attribute Handling" below.
+Otherwise, only built-in attributes will be returned.
+.IP reftype 4
+.IX Item "reftype"
+This routine expects a single parameter\-\-a reference to a subroutine or
+variable. It returns the built-in type of the referenced variable,
+ignoring any package into which it might have been blessed.
+This can be useful for determining the \fItype\fR value which forms part of
+the method names described in "Package-specific Attribute Handling" below.
+.PP
+Note that these routines are \fInot\fR exported by default.
+.SS "Package-specific Attribute Handling"
+.IX Subsection "Package-specific Attribute Handling"
+\&\fBWARNING\fR: the mechanisms described here are still experimental. Do not
+rely on the current implementation. In particular, there is no provision
+for applying package attributes to 'cloned' copies of subroutines used as
+closures. (See "Making References" in perlref for information on closures.)
+Package-specific attribute handling may change incompatibly in a future
+release.
+.PP
+When an attribute list is present in a declaration, a check is made to see
+whether an attribute 'modify' handler is present in the appropriate package
+(or its \f(CW@ISA\fR inheritance tree). Similarly, when \f(CW\*(C`attributes::get\*(C'\fR is
+called on a valid reference, a check is made for an appropriate attribute
+\&'fetch' handler. See "EXAMPLES" to see how the "appropriate package"
+determination works.
+.PP
+The handler names are based on the underlying type of the variable being
+declared or of the reference passed. Because these attributes are
+associated with subroutine or variable declarations, this deliberately
+ignores any possibility of being blessed into some package. Thus, a
+subroutine declaration uses "CODE" as its \fItype\fR, and even a blessed
+hash reference uses "HASH" as its \fItype\fR.
+.PP
+The class methods invoked for modifying and fetching are these:
+.IP FETCH_\fItype\fR_ATTRIBUTES 4
+.IX Item "FETCH_type_ATTRIBUTES"
+This method is called with two arguments: the relevant package name,
+and a reference to a variable or subroutine for which package-defined
+attributes are desired. The expected return value is a list of
+associated attributes. This list may be empty.
+.IP MODIFY_\fItype\fR_ATTRIBUTES 4
+.IX Item "MODIFY_type_ATTRIBUTES"
+This method is called with two fixed arguments, followed by the list of
+attributes from the relevant declaration. The two fixed arguments are
+the relevant package name and a reference to the declared subroutine or
+variable. The expected return value is a list of attributes which were
+not recognized by this handler. Note that this allows for a derived class
+to delegate a call to its base class, and then only examine the attributes
+which the base class didn't already handle for it.
+.Sp
+The call to this method is currently made \fIduring\fR the processing of the
+declaration. In particular, this means that a subroutine reference will
+probably be for an undefined subroutine, even if this declaration is
+actually part of the definition.
+.PP
+Calling \f(CWattributes::get()\fR from within the scope of a null package
+declaration \f(CW\*(C`package ;\*(C'\fR for an unblessed variable reference will
+not provide any starting package name for the 'fetch' method lookup.
+Thus, this circumstance will not result in a method call for package-defined
+attributes. A named subroutine knows to which symbol table entry it belongs
+(or originally belonged), and it will use the corresponding package.
+An anonymous subroutine knows the package name into which it was compiled
+(unless it was also compiled with a null package declaration), and so it
+will use that package name.
+.SS "Syntax of Attribute Lists"
+.IX Subsection "Syntax of Attribute Lists"
+An attribute list is a sequence of attribute specifications, separated by
+whitespace or a colon (with optional whitespace).
+Each attribute specification is a simple
+name, optionally followed by a parenthesised parameter list.
+If such a parameter list is present, it is scanned past as for the rules
+for the \f(CWq()\fR operator. (See "Quote and Quote-like Operators" in perlop.)
+The parameter list is passed as it was found, however, and not as per \f(CWq()\fR.
+.PP
+Some examples of syntactically valid attribute lists:
+.PP
+.Vb 4
+\& switch(10,foo(7,3)) : expensive
+\& Ugly(\*(Aq\e(") :Bad
+\& _5x5
+\& lvalue method
+.Ve
+.PP
+Some examples of syntactically invalid attribute lists (with annotation):
+.PP
+.Vb 5
+\& switch(10,foo() # ()\-string not balanced
+\& Ugly(\*(Aq(\*(Aq) # ()\-string not balanced
+\& 5x5 # "5x5" not a valid identifier
+\& Y2::north # "Y2::north" not a simple identifier
+\& foo + bar # "+" neither a colon nor whitespace
+.Ve
+.SH EXPORTS
+.IX Header "EXPORTS"
+.SS "Default exports"
+.IX Subsection "Default exports"
+None.
+.SS "Available exports"
+.IX Subsection "Available exports"
+The routines \f(CW\*(C`get\*(C'\fR and \f(CW\*(C`reftype\*(C'\fR are exportable.
+.SS "Export tags defined"
+.IX Subsection "Export tags defined"
+The \f(CW\*(C`:ALL\*(C'\fR tag will get all of the above exports.
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+Here are some samples of syntactically valid declarations, with annotation
+as to how they resolve internally into \f(CW\*(C`use attributes\*(C'\fR invocations by
+perl. These examples are primarily useful to see how the "appropriate
+package" is found for the possible method lookups for package-defined
+attributes.
+.IP 1. 4
+Code:
+.Sp
+.Vb 3
+\& package Canine;
+\& package Dog;
+\& my Canine $spot : Watchful ;
+.Ve
+.Sp
+Effect:
+.Sp
+.Vb 2
+\& use attributes ();
+\& attributes::\->import(Canine => \e$spot, "Watchful");
+.Ve
+.IP 2. 4
+Code:
+.Sp
+.Vb 2
+\& package Felis;
+\& my $cat : Nervous;
+.Ve
+.Sp
+Effect:
+.Sp
+.Vb 2
+\& use attributes ();
+\& attributes::\->import(Felis => \e$cat, "Nervous");
+.Ve
+.IP 3. 4
+Code:
+.Sp
+.Vb 2
+\& package X;
+\& sub foo : lvalue ;
+.Ve
+.Sp
+Effect:
+.Sp
+.Vb 1
+\& use attributes X => \e&foo, "lvalue";
+.Ve
+.IP 4. 4
+Code:
+.Sp
+.Vb 2
+\& package X;
+\& sub Y::x : lvalue { 1 }
+.Ve
+.Sp
+Effect:
+.Sp
+.Vb 1
+\& use attributes Y => \e&Y::x, "lvalue";
+.Ve
+.IP 5. 4
+Code:
+.Sp
+.Vb 2
+\& package X;
+\& sub foo { 1 }
+\&
+\& package Y;
+\& BEGIN { *bar = \e&X::foo; }
+\&
+\& package Z;
+\& sub Y::bar : lvalue ;
+.Ve
+.Sp
+Effect:
+.Sp
+.Vb 1
+\& use attributes X => \e&X::foo, "lvalue";
+.Ve
+.PP
+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.
+.SH "MORE EXAMPLES"
+.IX Header "MORE EXAMPLES"
+.IP 1. 4
+.Vb 2
+\& sub MODIFY_CODE_ATTRIBUTES {
+\& my ($class,$code,@attrs) = @_;
+\&
+\& my $allowed = \*(AqMyAttribute\*(Aq;
+\& my @bad = grep { $_ ne $allowed } @attrs;
+\&
+\& return @bad;
+\& }
+\&
+\& sub foo : MyAttribute {
+\& print "foo\en";
+\& }
+.Ve
+.Sp
+This example runs. At compile time
+\&\f(CW\*(C`MODIFY_CODE_ATTRIBUTES\*(C'\fR is called. In that
+subroutine, we check if any attribute is disallowed and we return a list of
+these "bad attributes".
+.Sp
+As we return an empty list, everything is fine.
+.IP 2. 4
+.Vb 2
+\& sub MODIFY_CODE_ATTRIBUTES {
+\& my ($class,$code,@attrs) = @_;
+\&
+\& my $allowed = \*(AqMyAttribute\*(Aq;
+\& my @bad = grep{ $_ ne $allowed }@attrs;
+\&
+\& return @bad;
+\& }
+\&
+\& sub foo : MyAttribute Test {
+\& print "foo\en";
+\& }
+.Ve
+.Sp
+This example is aborted at compile time as we use the attribute "Test" which
+isn't allowed. \f(CW\*(C`MODIFY_CODE_ATTRIBUTES\*(C'\fR
+returns a list that contains a single
+element ('Test').
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+"Private Variables via \fBmy()\fR" in perlsub and
+"Subroutine Attributes" in perlsub for details on the basic declarations;
+"use" in perlfunc for details on the normal invocation mechanism.