Skip to content

Instantly share code, notes, and snippets.

@jonathanstowe
Created December 10, 2021 16:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonathanstowe/643709476b3038a100d3f7121151f3e3 to your computer and use it in GitHub Desktop.
Save jonathanstowe/643709476b3038a100d3f7121151f3e3 to your computer and use it in GitHub Desktop.
Raku version of classic observer pattern example but without a fixed interface.
#!/usr/bin/env raku
role ObserverSignal {
}
multi sub trait_mod:<is> ( Method $m, :$observer-signal! ) {
$m does ObserverSignal;
}
role Observable {
has @.observers;
method signal() {
for @.observers -> $observer {
for $observer.^methods.grep(ObserverSignal).grep(*.cando(\($observer, self))) -> $method {
$observer.$method(self);
}
}
}
}
class Subject is Observable {
}
class Observer {
method any-old-name(Subject $) is observer-signal {
say "got Subject signal";
}
}
my $subject = Subject.new;
$subject.observers.push: Observer.new;
$subject.signal;
# vim: ft=raku
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment