-
-
Notifications
You must be signed in to change notification settings - Fork 373
/
traits.pm
65 lines (52 loc) · 1.75 KB
/
traits.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Need to be able to augment in the setting, and this is the first file, so we
# put this here.
use MONKEY_TYPING;
use SETTING_MODE;
# XXX Signature is wrong really - will fix once we can parse other things.
our multi trait_mod:<is>(Mu $child, Mu $parent) {
$child.^add_parent($parent);
}
our multi trait_mod:<is>(Mu $child, Role $r) {
$child.^add_parent($r!select!pun);
}
our multi trait_mod:<is>(Mu $type where { !.defined }, :$rw!) {
$type.HOW does role { method rw { True } }
}
our multi trait_mod:<is>(Mu $type where { !.defined }, :$hidden!) {
$type.HOW does role { method hidden { True } }
}
our multi trait_mod:<is>(Routine $r, :$default!) {
$r does role { method default { True } }
}
our multi trait_mod:<hides>(Mu $child, Mu $parent) {
trait_mod:<is>($child, $parent);
$child.^hides.push($parent);
}
role Positional { ... }
role Associative { ... }
our multi trait_mod:<of>(ContainerDeclarand $cont, Mu \$type) {
given substr($cont.name, 0, 1) {
when '@' { $cont.container does Positional[$type] }
when '%' { $cont.container does Associative[$type] }
when '&' { }
default { pir::setprop__vPSP($cont.container, 'type', $type) }
}
}
our multi trait_mod:<does>(Mu $target, Role $r) {
$target.^add_composable($r);
}
our multi trait_mod:<does>(Mu $target, ConcreteRole $r) {
$target.^add_composable($r);
}
our multi trait_mod:<does>(Mu $target, Mu $unrole) {
die "Can only use does with a role, but " ~ $unrole.perl ~ " is not one";
}
our multi trait_mod:<does>(ContainerDeclarand $c, Role $r) {
$c.container does $r;
}
our multi trait_mod:<of>(Routine $r, Mu \$type) {
$r does Callable[$type];
}
our multi trait_mod:<returns>(Routine $r, Mu \$type) {
$r does Callable[$type];
}