-
-
Notifications
You must be signed in to change notification settings - Fork 373
/
Block.pm
34 lines (32 loc) · 1.21 KB
/
Block.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
my class Block {
method add_phaser(Str $name, &block) {
nqp::isnull($!phasers) &&
nqp::bindattr(self, Block, '$!phasers', nqp::hash());
nqp::existskey($!phasers, nqp::unbox_s($name)) ||
nqp::bindkey($!phasers, nqp::unbox_s($name), nqp::list());
if $name eq any(<LEAVE KEEP UNDO>) {
nqp::unshift(nqp::atkey($!phasers, nqp::unbox_s($name)), &block);
self.add_phaser('!LEAVE-ORDER', &block);
}
elsif $name eq any(<NEXT !LEAVE-ORDER POST>) {
nqp::unshift(nqp::atkey($!phasers, nqp::unbox_s($name)), &block);
}
else {
nqp::push(nqp::atkey($!phasers, nqp::unbox_s($name)), &block);
}
}
method fire_phasers(str $name) {
if !nqp::isnull($!phasers) && nqp::existskey($!phasers, $name) {
my Mu $iter := nqp::iterator(nqp::atkey($!phasers, $name));
nqp::shift($iter).() while $iter;
}
}
method phasers(Str $name) {
unless nqp::isnull($!phasers) {
if nqp::existskey($!phasers, nqp::unbox_s($name)) {
return nqp::p6parcel(nqp::atkey($!phasers, nqp::unbox_s($name)), Mu);
}
}
()
}
}