-
Notifications
You must be signed in to change notification settings - Fork 135
/
attributes.t
61 lines (48 loc) · 1.23 KB
/
attributes.t
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
use v6;
use Test;
plan 7;
# L<S14/Roles/"Roles may have attributes">
{
role R1 {
has $!a1;
has $.a2 is rw;
};
class C1 does R1 {
method set_a1($val) {
$!a1 = $val;
}
method get_a1 {
$!a1
}
};
my $x = C1.new();
$x.set_a1('abc');
is $x.get_a1, 'abc', 'Can set and get class-private attr from role';
$x.a2 = 'xyz';
is $x.a2, 'xyz', 'Public attribute gets accessor/mutator composed';
}
role R2 {
has Int $!a;
}
throws-like 'class C3 does R2 { has $!a }', Exception, 'Roles with conflicing attributes';
throws-like 'class C2 does R2 { has Int $!a }', Exception, 'Same name, same type will also conflicts';
role R3 {
has $.x = 42;
}
class C4 does R3 { }
is C4.new.x, 42, 'initializing attributes in a role works';
role R4 { has @!foo; method bar() { @!foo } }
class C5 does R4 {
has $.baz;
}
is C5.new().bar(), [], 'Composing an attribute into a class that already has one works';
{
role R6 {
has %!e;
method el() { %!e<a> };
submethod BUILD(:%!e) { };
}
class C6 does R6 { };
is C6.new(e => { a => 42 }).el, 42, 'can use :%!role_attr in BUILD signature';
}
# vim: syn=perl6