On Fri, Dec 12, 2003 at 04:23:02AM -0700, Luke Palmer wrote:
: So I'm seeing a lot of inconsistent OO-vocabulary around here, and it
: makes things pretty hard to understand.

Agreed.

: So here's how Perl 6 is using said inconsistent terms, AFAIK:
: 
:     - attribute
:       A concrete data member of a class.  Used with C<has>.

Declared with C<has> is a little more precise.

:     - property
:       An out-of-band sticky note to be placed on a single object.
:         Used with C<but>.

Maybe "applied with"?

:     - trait
:       A compile time sticky note to be placed on a wide variety of things. 
:         Used with C<is>.

Fine.  (Though I like to hyphenate "compile-time" when it's an adjective,
and not when it's a noun.  Same for "run-time", just to be consistent.)

:     - role
:       A collection of methods to be incorporated into a class sans

A role can also supply one or more attributes.

:         inheritance (and maybe some other stuff, too).  Used with C<does>.

Here it gets a little fuzzier.  A role can be applied to a class
at compile time via "does", or to an object at run time via "but".
A property is a simple kind of role that supplies a single attribute.
The type of a property is identical to its role name.  Roles can have
subtypes that function as enums when the subtypes are constrained to a
single value.  You can use one of these subtypes without specifically
implying the role name.  So saying

    $bar but Red

might give you a value with the property Color.  You can write the corresponding
boolean test using the smart match operator:

    $bar ~~ Red

and it (smartly) picks out the Color property to compare with, provided
it's unambiguous.  You can use that syntax to compare against any
subtype or junction of subtypes:

    $bar ~~ Redish&Whiteish     # pinkish

: So for example:
: 
:     class Dog
:         does Boolean                # role
:         is extended                 # trait
:         is Mammal                   # [1]
:     {
:         has $.tail;                 # attribute
:         has @.legs;                 # attribute
:     }
: 
:     my $fido = Dog.new
:                 but false;          # property
: 
: Hope that clears things up.

Yes, it does.

: Luke
: 
: [1] This is a base class, which is an overloaded use of C<is>.  Though,
: upon A12 release, we'll probably find out that it's not overloaded but
: instead, elegantly unified, somehow. 

If not, it'll be easy to turn it into an "isa".

Larry

Reply via email to