(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: Symmetry between Attributes and Accessors] It is proposed that class attributes may be treated as functionally equivalent to an identically named accessor method. In this manner, it shall become irrelevant to callers whether a public attribute of an object is implemented as an attribute, or an lvalue method. Subclasses may implement either form, at will: class Bar { attr $foo is public, Integer; # a value } class Zap is Bar { method foo is Integer is lvalue { ... a calculation ... }; } ... my $v1 = $my_bar.foo = 5; my $v2 = $my_zap.foo = 5; # no difference [Discussion] Perl6 has identical syntax for accessing methods and attributes. If this remains the case, than an attribute can be thought of as being symmetric (from the caller's point of view) with an lvalue-based accessor: method foo is Integer is lvalue { ... } As such, there may be no need for the users of a class to differentiate between the two. The usefulness of this approach lies in the ability to extend aspects of a class that were not originally intended to be dynamic, i.e., to apply a calculation to an otherwise static attribute, and vice versa. Note that in languages that differentiate between "$obj.foo" and $obj.foo()", changing a public attribute to a method clearly violates the public interface of the class, and can involve search-and-replaces in large libraries of code. An alternative approach to this proposal is typically implemented using explicit accessor methods: class Bar { attr $_foo is Integer; method foo is Integer is lvalue { $._foo }; } class Zap is Bar { method foo is Integer is lvalue { ... a calculation ... } } This approach is predicated on class Bar being constructed with the appropriate accessor methods in the first place. The question is, should the proposed symmetry be introduced to allow better subclassing of classes that do _not_ follow this recommended practice. [PROS] - Allows substantial flexibility in the use of public attributes. - Similar usage exists in other OO languages, so people are familiar with the notion. - perl5 migrants -- used to the notions of objects-as-hashes, and all attributes being public -- might find this feature comforting. [CONS] - Making publicly accessible attributes at all is considered Bad Form in most OO methodologies, which advocate the use of explicit accessor methods. We may wish to discourage or even prohibit the behavior. - An attribute and a method are _not_ typically implemented in the same manner. Treating the two as interchangeable might imply runtime overhead. [Related Issues, Known Implications] - Proposal: Attributes: "public" vs. "private" - Proposal: Attributes may contain automatically dereferenced Closures - Proposal: Use of Attributes within Interfaces - Whether accessor methods are automatically generated for attributes. MikeL