Я пытаюсь написать шаблон наблюдателя, используя класс таймера, который вызывает своих подписчиков с заданным интервалом. Все время пытаясь понять концепцию обещаний в Perl6.
class Timer does Observable
{
has Promise $!p;
has Int $!interval;
has Bool $!active = False;
submethod BUILD(Int :$!interval) {}
method start {
$!p = Promise.start( {
$!active = True;
loop {
sleep($!interval);
@!action_listeners>>.actionPerformed(ActionEvent.new);
if !$!active {$!p.keep}
}
});
}
method stop {
$!active = False;
}
}
Роль Обозреватель просто имеет массив с подписчиками. Конечно, я должен был создать метод обновления всех подписчиков в роли.
role Observable {
has ActionListener @!action_listeners;
method addActionListener(ActionListener $al){
@!action_listeners.push($al);
}
method removeActionListener{
@!action_listeners.pop;
}
}
Роль ActionListener просто имеет метод actionPerformed. Класс ActionEvent может быть не обязательным, на данный момент это просто пустой класс.
role ActionListener
{
method actionPerformed(ActionEvent $e) { ... }
}
Запуск из скрипта:
my Subscriber $s = Subscriber.new;
my Timer $t = Timer.new(interval => 1);
$t.start;
$t.addActionListener($s);
$t.addActionListener(Subscriber.new);
.... #doing stuff that lasts for a while
$t.stop;
Класс подписчика реализует роль ActionListener (имеет метод с именем actionPerformed).
Хотя это работает нормально: метод actionPerformed подписчиков вызывается до тех пор, пока я не вызову метод stop таймера. Пока нет правильного способа удалить данного подписчика. Также мне было интересно, есть ли лучший способ сохранить / нарушить обещание извне, учитывая, что код циклически повторяется.
Мне в основном интересно, не могу ли я упустить встроенные функции в Perl6? Я изобретаю колесо?