From f4f25e896e8495a404f3c8e12c9870d9b36583d5 Mon Sep 17 00:00:00 2001 From: Rocco Caputo Date: Wed, 7 Apr 2010 23:52:23 -0400 Subject: [PATCH] Hide some of the promise awkwardness in a Promise watcher. It's a better solution, but it's not entirely satisfying. It will change as something better comes along. --- eg/ReflexPromise.pm | 29 ++++++++++++++++++++++++++++ eg/eg-30-promise-timer.pl | 40 ++++++++++++++++++++++++++++++--------- 2 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 eg/ReflexPromise.pm diff --git a/eg/ReflexPromise.pm b/eg/ReflexPromise.pm new file mode 100644 index 0000000..1787f8a --- /dev/null +++ b/eg/ReflexPromise.pm @@ -0,0 +1,29 @@ +package ReflexPromise; + +use Moose; +extends 'Reflex::Object'; + +use Reflex::Callbacks qw(cb_promise); + +has object => ( + isa => 'Reflex::Object', + is => 'ro', +); + +has promise => ( + isa => 'ScalarRef', + is => 'ro', + default => sub { return \my $x }, +); + +sub BUILD { + my $self = shift; + $self->observe($self->object(), cb_promise($self->promise())); +} + +sub wait { + my $self = shift; + return ${$self->promise()}->wait(); +} + +1; diff --git a/eg/eg-30-promise-timer.pl b/eg/eg-30-promise-timer.pl index c9d7e31..d8654f1 100644 --- a/eg/eg-30-promise-timer.pl +++ b/eg/eg-30-promise-timer.pl @@ -9,16 +9,38 @@ use Reflex::Callbacks qw(cb_promise); use ExampleHelpers qw(eg_say); -my $watcher = Reflex::Object->new(); +# Most verbose syntax. +# TODO - The $watcher is useless. How can it be eliminated? -my $promise; -my $timer = Reflex::Timer->new( - interval => 1, - auto_repeat => 1, -); +{ + my $timer = Reflex::Timer->new( + interval => 1, + auto_repeat => 1, + ); -$watcher->observe($timer, cb_promise(\$promise)); + my $promise; + my $watcher = Reflex::Object->new(); + $watcher->observe($timer, cb_promise(\$promise)); -while (my $event = $promise->wait()) { - eg_say("wait() returned an event (@$event)"); + while (my $event = $promise->wait()) { + eg_say("wait() returned an event (@$event)"); + } +} + +# Wrap some of the syntax into a Reflex::Promise object. +# TODO - Still has a $watcher, but it's hidden in a Reflex::Promise. + +{ + use ReflexPromise; + + my $p = ReflexPromise->new( + object => Reflex::Timer->new( + interval => 1, + auto_repeat => 1, + ) + ); + + while (my $event = $p->wait()) { + eg_say("wait() returned an event (@$event)"); + } }