> -----Original Message-----
> From: Larry Wall [mailto:[EMAIL PROTECTED]
> Sent: Friday, December 12, 2003 12:17 PM
> : - role
> : A collection of methods to be incorporated into a class sans
>
> A role can also supply one or more attributes.
So a role can constrain values and add behavior and attributes. Presumably
it can do both at the same time?
enum ParityMode values <P_ODD P_EVEN P_NONE>;
role Byte
does Int[0..255] # Value constraint
does { # extending by adding attributes & methods, and by
overriding the STORE method
has ParityMode $.parity_mode = NONE;
has bit $.parity;
# .CONFORM is redundant with Value constraint above,
which autogenerates this.
method CONFORM(Int $i) { SUPER && 0 <= $i <= 255; }
method STORE(Int $i: $v) { $i = .CONFORM($v) || fail; set_parity; }
method set_parity {...}
};
> : 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".
Good. I like the mixin being available at either time. This makes properties
a lot more useful since I can provided "default" or "normal" values:
role Celebrated
does Date
does {
method celebrated($d) { return $d.date; }
}
class Birthday does Celebrated {
has $.date;
}
my Birthday $d = Birthday.new('February', 29, 2004) but
Celebrated('March', 01, 2004);
print "My birthday is celebrated $d.celebrated";
I presume that the linear order (compile time) or chronological order of
applying roles decides the order in which overlaid methods are
C<wrap>ed/overlaid.
Which is it, by the way? Or is there MTOWTDI, such as a method modifier for
specifying polymorph behavior?
method CONFORM is wrapped { ... call ... }
> 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.
This seems really clunky for enums. It works okay for boolean, but even
doing month-names is going to suck pretty hard:
role Month;
role January does Month[0];
role February does Month[1];
role March does Month[2];
role April does Month[3];
role May does Month[4];
role June does Month[5];
role July does Month[6];
role August does Month[7];
role September does Month[8];
role October does Month[9];
role November does Month[10];
role December does Month[11];
role Month does Int[January..December];
> 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.
This is smart and helpful. I like it. However, there needs to be a way to
specify what to do when multiple roles share the same values. For example,
if I have NeededBy and Estimated roles:
my $birthday = "02/29/2004" but March;
my $ship_date = "01/01/01" but NeededBy(February);
> 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
>
Disambiguation?
$bar ~~ NeededBy(February)
or
$bar.NeededBy ~~ February
=Austin