-
Notifications
You must be signed in to change notification settings - Fork 131
/
NQPAttribute.pm
80 lines (69 loc) · 2.01 KB
/
NQPAttribute.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
knowhow NQPAttribute {
has $!name;
has $!type;
has $!has_type;
has $!box_target;
method new(:$name!, :$box_target, *%extra) {
my $attr := nqp::create(self);
$attr.BUILD(:name($name), |%extra, :box_target($box_target),
:has_type(nqp::existskey(%extra, 'type')));
$attr
}
method BUILD(:$name, :$type, :$has_type, :$box_target) {
$!name := $name;
$!type := $type;
$!has_type := $has_type;
$!box_target := $box_target;
}
method name() {
$!name
}
method type() {
$!has_type ?? $!type !! nqp::null()
}
method has_accessor() {
0
}
method build_closure() {
0
}
method box_target() {
$!box_target ?? 1 !! 0
}
method compose($obj) {
#my $long_name := ~$!name;
#if self.has_mutator {
# my $method := nqp::substr($long_name, 1);
# unless has_method($obj, $method, 0) {
# $obj.HOW.add_method($obj.WHAT, $method, method ($value?) {
# pir::setattribute__vppsp(self, $obj.WHAT, $long_name, $value)
# if nqp::defined($value);
# pir::getattribute__ppps(self, $obj.WHAT, $long_name);
# }
# );
# }
#}
#else {
# my $method := nqp::substr($long_name, 2);
# unless has_method($obj, $method, 0) {
# $obj.HOW.add_method($obj, $method,
# method () {
# pir::getattribute__PPPs(self, $obj.WHAT, $long_name);
# }
# );
# }
#}
$obj
}
# Hack to check twigil.
method has_mutator() {
nqp::substr(~$!name, 1, 1) ne '!';
}
sub has_method($target, $name, $local) {
my @methods := $target.HOW.methods($target, :local($local));
for @methods {
if $_ eq $name { return 1; }
}
return 0;
}
}