On Fri, 4 Oct 2002, Michael Lazzaro wrote:
: Date: Fri, 4 Oct 2002 16:40:04 -0700
: From: Michael Lazzaro <[EMAIL PROTECTED]>
: To: [EMAIL PROTECTED]
: Subject: Draft Proposal: Declaring Classwide Attributes
:
: (Disclaimer: My purpose in proposing this is not to recommend it, but
: to document whether the idea should be endorsed, or shot down, and any
: proposed canonical syntax. Note that the later implications of these
: choices are quite substantial. Please discuss!)
:
: [Draft Proposal: Declaring Classwide Attributes]
:
: Within a class, "classwide attributes" are declared using the standard
: "my" and "our".
:
: Example:
:
: class Zap {
: my %zap_cache; # a private classwide attribute
: our $zap_count = 0; # a public classwide attribute
:
: attr $foo;
: attr $bar;
: }
:
:
: [Discussion]
:
: Many OO-based languages have the concept of "classwide" attributes;
: that is, attributes that only exist once, for the class (and all
: subclasses?), as opposed to existing one for each instance of a class.
: You can use these attributes as counters, or caches, or any other
: common ground for use by all instances of the class.
:
: Within a class definition, Perl simply uses the my/our keywords for
: this purpose.
:
: If any value is to be assigned to a "classwide" attributes, that
: assignment is done once, upon initialization of the class.
If you want accessor methods, use the dot:
class Zap {
my %.zap_cache; # a private classwide attribute
our $.zap_count = 0; # a public classwide attribute
has $.foo;
has $.bar;
}
It may be that $.zap_count is public not so much because of the class definition
where it would default to private, but because $.zap_count's real global name is
$Zap::.zap_count. To get a public accessor method you might still need to declare
it public. And you could get a public accessor method to the "my" variable as well
the same way. (That means is that the {...} of the class definition is really just
a closure that executes once when the class is built.)
Larry