From 2aa55c2647d658c1752ec62048f6bb8f52ed039f Mon Sep 17 00:00:00 2001 From: Rocco Caputo Date: Sun, 20 Sep 2009 01:56:18 -0400 Subject: [PATCH] Give the fourth sortie a new name. It's 53% done now! --- docs/Stage.pm | 12 ------ docs/Ttl/Adder.pm | 22 +++++------ docs/Ttl/Bin.pm | 10 ++--- docs/Ttl/FlipFlop/D.pm | 30 +++++++-------- docs/Ttl/FlipFlop/JK.pm | 20 +++++----- docs/Ttl/FlipFlop/MasterSlave.pm | 18 ++++----- docs/Ttl/FlipFlop/T.pm | 12 +++--- docs/Ttl/HexDecoder.pm | 12 +++--- docs/Ttl/Latch/ClockedNandRS.pm | 18 ++++----- docs/Ttl/Latch/NandRS.pm | 14 +++---- docs/Ttl/Latch/NorRS.pm | 14 +++---- docs/Ttl/Nand.pm | 19 +++------- docs/Ttl/Nor.pm | 10 ++--- docs/Ttl/TriAnd.pm | 12 +++--- docs/Ttl/TriNand.pm | 12 +++--- docs/Ttl/Un.pm | 8 ++-- docs/eg-01-discrete-observer.pl | 32 +++++++++------- docs/eg-02-observed-new.pl | 18 +++++---- docs/eg-03-observer-roles.pl | 38 +++++++++---------- docs/eg-04-inheritance.pl | 14 +++++-- docs/eg-05-composition.pl | 22 +++++++---- docs/eg-06-moose-roles.pl | 14 +++++-- docs/eg-07-wheel-run.pl | 16 +++++--- docs/eg-08-observer-trait.pl | 20 ++++++---- docs/eg-09-emitter-trait.pl | 28 ++++++++------ docs/eg-10-setup.pl | 31 ++++++++------- docs/eg-11-poco-postback.pl | 20 +++++++--- docs/eg-12-poco-event.pl | 21 ++++++---- docs/eg-13-irc-bot.pl | 21 +++++----- docs/fail-ttl-counter.pl | 36 ++++++++++-------- docs/fail-ttl-simple.pl | 12 ++++-- docs/{ => lib/Reflex}/Handle.pm | 4 +- docs/lib/Reflex/Object.pm | 12 ++++++ docs/{SignalChild.pm => lib/Reflex/PID.pm} | 4 +- docs/{PoeEvent.pm => lib/Reflex/POE/Event.pm} | 20 +++++----- docs/{ => lib/Reflex/POE}/Postback.pm | 12 +++--- .../Reflex/POE/Session.pm} | 4 +- docs/{ => lib/Reflex/POE}/Wheel.pm | 4 +- .../Reflex/POE/Wheel/Run.pm} | 10 ++--- .../Reflex/Role/Object.pm} | 31 +++++++++------ .../Reflex/Role/UdpPeer.pm} | 10 ++--- docs/{ => lib/Reflex}/Signal.pm | 4 +- docs/{Delay.pm => lib/Reflex/Timer.pm} | 4 +- .../Reflex/Trait/Emitter.pm} | 6 +-- .../Reflex/Trait/Observer.pm} | 6 +-- docs/{ => lib/Reflex}/UdpPeer.pm | 6 +-- docs/requirements.otl | 25 ++++++------ 47 files changed, 410 insertions(+), 338 deletions(-) delete mode 100644 docs/Stage.pm rename docs/{ => lib/Reflex}/Handle.pm (96%) create mode 100644 docs/lib/Reflex/Object.pm rename docs/{SignalChild.pm => lib/Reflex/PID.pm} (92%) rename docs/{PoeEvent.pm => lib/Reflex/POE/Event.pm} (52%) rename docs/{ => lib/Reflex/POE}/Postback.pm (83%) rename docs/{PoeSession.pm => lib/Reflex/POE/Session.pm} (93%) rename docs/{ => lib/Reflex/POE}/Wheel.pm (97%) rename docs/{WheelRun.pm => lib/Reflex/POE/Wheel/Run.pm} (92%) rename docs/{StageRole.pm => lib/Reflex/Role/Object.pm} (94%) rename docs/{UdpPeerRole.pm => lib/Reflex/Role/UdpPeer.pm} (90%) rename docs/{ => lib/Reflex}/Signal.pm (97%) rename docs/{Delay.pm => lib/Reflex/Timer.pm} (95%) rename docs/{EmitterTrait.pm => lib/Reflex/Trait/Emitter.pm} (89%) rename docs/{ObserverTrait.pm => lib/Reflex/Trait/Observer.pm} (92%) rename docs/{ => lib/Reflex}/UdpPeer.pm (51%) diff --git a/docs/Stage.pm b/docs/Stage.pm deleted file mode 100644 index 5da7472..0000000 --- a/docs/Stage.pm +++ /dev/null @@ -1,12 +0,0 @@ -package Stage; - -use Moose; -with 'StageRole'; - -# Composes the StageRole role into a class. -# Does nothing of its own. - -no Moose; -__PACKAGE__->meta()->make_immutable(); - -1; diff --git a/docs/Ttl/Adder.pm b/docs/Ttl/Adder.pm index acf0fa2..8f6bae0 100644 --- a/docs/Ttl/Adder.pm +++ b/docs/Ttl/Adder.pm @@ -26,7 +26,7 @@ package Ttl::Adder; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::Xor; use Ttl::And; use Ttl::Or; @@ -34,61 +34,61 @@ use Ttl::Or; has a => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has b => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has cin => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has xor_ab => ( isa => 'Ttl::Xor', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has xor_cin => ( isa => 'Ttl::Xor', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has and_ab => ( isa => 'Ttl::And', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has and_cin => ( isa => 'Ttl::And', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has or_cout => ( isa => 'Ttl::Or', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has sum => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has cout => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_my_a { diff --git a/docs/Ttl/Bin.pm b/docs/Ttl/Bin.pm index 4930544..bee49ac 100644 --- a/docs/Ttl/Bin.pm +++ b/docs/Ttl/Bin.pm @@ -4,27 +4,27 @@ package Ttl::Bin; use Moose; -extends 'Stage'; -use EmitterTrait; +extends 'Reflex::Object'; +use Reflex::Trait::Emitter; has a => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has b => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has out => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); 1; diff --git a/docs/Ttl/FlipFlop/D.pm b/docs/Ttl/FlipFlop/D.pm index 4567362..eac4ac9 100644 --- a/docs/Ttl/FlipFlop/D.pm +++ b/docs/Ttl/FlipFlop/D.pm @@ -7,45 +7,45 @@ package Ttl::FlipFlop::D; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::TriNand; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has clear => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has clock => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has d => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has preset => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub BUILD { @@ -132,37 +132,37 @@ sub on_tri6_out { has tri1 => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has tri2 => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has tri3 => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has tri4 => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has tri5 => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has tri6 => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); 1; diff --git a/docs/Ttl/FlipFlop/JK.pm b/docs/Ttl/FlipFlop/JK.pm index a4e2830..c54a1ab 100644 --- a/docs/Ttl/FlipFlop/JK.pm +++ b/docs/Ttl/FlipFlop/JK.pm @@ -20,55 +20,55 @@ package Ttl::FlipFlop::JK; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::Latch::ClockedNandRS; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has nand_j => ( isa => 'Ttl::Nand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { j => 'a' }, ); has nand_k => ( isa => 'Ttl::Nand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { k => 'b' }, ); has trinand_preset => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { preset => 'a' }, ); has trinand_clear => ( isa => 'Ttl::TriNand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { clear => 'c' }, ); has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has clock => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub BUILD { diff --git a/docs/Ttl/FlipFlop/MasterSlave.pm b/docs/Ttl/FlipFlop/MasterSlave.pm index 797d609..1d4abfb 100644 --- a/docs/Ttl/FlipFlop/MasterSlave.pm +++ b/docs/Ttl/FlipFlop/MasterSlave.pm @@ -14,29 +14,29 @@ package Ttl::FlipFlop::MasterSlave; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::Latch::ClockedNandRS; use Ttl::Not; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has cnrs1 => ( isa => 'Ttl::Latch::ClockedNandRS', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => ['r', 's'], ); has cnrs2 => ( isa => 'Ttl::Latch::ClockedNandRS', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has not => ( isa => 'Ttl::Not', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); sub BUILD { @@ -54,19 +54,19 @@ sub BUILD { has clock => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_my_clock { diff --git a/docs/Ttl/FlipFlop/T.pm b/docs/Ttl/FlipFlop/T.pm index 3e044b2..4268a58 100644 --- a/docs/Ttl/FlipFlop/T.pm +++ b/docs/Ttl/FlipFlop/T.pm @@ -4,28 +4,28 @@ package Ttl::FlipFlop::T; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::FlipFlop::D; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has dff => ( isa => 'Ttl::FlipFlop::D', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => ['preset','clear','clock'], ); has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_dff_q { diff --git a/docs/Ttl/HexDecoder.pm b/docs/Ttl/HexDecoder.pm index 2e617ca..1ecc98c 100644 --- a/docs/Ttl/HexDecoder.pm +++ b/docs/Ttl/HexDecoder.pm @@ -3,40 +3,40 @@ package Ttl::HexDecoder; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; has ones => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has twos => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has fours => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has eights => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has out => ( isa => 'Str', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_my_change { diff --git a/docs/Ttl/Latch/ClockedNandRS.pm b/docs/Ttl/Latch/ClockedNandRS.pm index fc3231f..37fdead 100644 --- a/docs/Ttl/Latch/ClockedNandRS.pm +++ b/docs/Ttl/Latch/ClockedNandRS.pm @@ -14,30 +14,30 @@ package Ttl::Latch::ClockedNandRS; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::Nand; use Ttl::Latch::NandRS; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has nand_not_r => ( isa => 'Ttl::Nand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { not_r => 'b' }, ); has nand_s => ( isa => 'Ttl::Nand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { s => 'a' }, ); has clk => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_my_clk { @@ -49,7 +49,7 @@ sub on_my_clk { has latch => ( isa => 'Ttl::Latch::NandRS', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); sub BUILD { @@ -72,13 +72,13 @@ sub on_nand_not_r_out { has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_latch_q { diff --git a/docs/Ttl/Latch/NandRS.pm b/docs/Ttl/Latch/NandRS.pm index 957ee8f..f4a0753 100644 --- a/docs/Ttl/Latch/NandRS.pm +++ b/docs/Ttl/Latch/NandRS.pm @@ -16,35 +16,35 @@ package Ttl::Latch::NandRS; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::Nand; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has nand_r => ( isa => 'Ttl::Nand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { r => 'b' }, ); has nand_s => ( isa => 'Ttl::Nand', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { s => 'a' }, ); has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_nand_s_out { diff --git a/docs/Ttl/Latch/NorRS.pm b/docs/Ttl/Latch/NorRS.pm index 07b7133..5dadf66 100644 --- a/docs/Ttl/Latch/NorRS.pm +++ b/docs/Ttl/Latch/NorRS.pm @@ -16,35 +16,35 @@ package Ttl::Latch::NorRS; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::Nor; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has nor_r => ( isa => 'Ttl::Nor', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { r => 'a' }, ); has nor_s => ( isa => 'Ttl::Nor', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { s => 'b' }, ); has q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); has not_q => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_nor_s_out { diff --git a/docs/Ttl/Nand.pm b/docs/Ttl/Nand.pm index 308bcac..064de06 100644 --- a/docs/Ttl/Nand.pm +++ b/docs/Ttl/Nand.pm @@ -12,32 +12,23 @@ use Moose; extends 'Ttl::Bin'; use Ttl::Not; use Ttl::And; -use ObserverTrait; +use Reflex::Trait::Observer; has and => ( isa => 'Ttl::And', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => [qw(a b)], + setup => sub { Ttl::And->new() }, ); has not => ( isa => 'Ttl::Not', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], + setup => sub { Ttl::Not->new() }, ); -sub BUILD { - my $self = shift; - - # TODO - I would love to set these from the attributes' "default", - # but Observer traits won't kick in because Moose doesn't invoke - # "trigger" on defaults. - - $self->and( Ttl::And->new() ); - $self->not( Ttl::Not->new() ); -} - sub on_and_out { my ($self, $args) = @_; $self->not->in($args->{value}); diff --git a/docs/Ttl/Nor.pm b/docs/Ttl/Nor.pm index 1bd5003..6574b17 100644 --- a/docs/Ttl/Nor.pm +++ b/docs/Ttl/Nor.pm @@ -12,29 +12,25 @@ use Moose; extends 'Ttl::Bin'; use Ttl::Not; use Ttl::Or; -use ObserverTrait; +use Reflex::Trait::Observer; # Ttl::Or handles a and b input for Ttl::Nor. has or => ( isa => 'Ttl::Or', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => [qw(a b)], ); has not => ( isa => 'Ttl::Not', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); sub BUILD { my $self = shift; - # TODO - I would love to set these from the attributes' "default", - # but Observer traits won't kick in because Moose doesn't invoke - # "trigger" on defaults. - $self->or( Ttl::Or->new() ); $self->not( Ttl::Not->new() ); } diff --git a/docs/Ttl/TriAnd.pm b/docs/Ttl/TriAnd.pm index 28bd6b9..635d380 100644 --- a/docs/Ttl/TriAnd.pm +++ b/docs/Ttl/TriAnd.pm @@ -18,29 +18,29 @@ package Ttl::TriAnd; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::And; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has and_ab => ( isa => 'Ttl::And', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => [qw(a b)], ); has and_c => ( isa => 'Ttl::And', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => { c => 'b' }, ); has out => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub BUILD { diff --git a/docs/Ttl/TriNand.pm b/docs/Ttl/TriNand.pm index 17ee509..044c5ea 100644 --- a/docs/Ttl/TriNand.pm +++ b/docs/Ttl/TriNand.pm @@ -17,29 +17,29 @@ package Ttl::TriNand; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Ttl::TriAnd; use Ttl::Not; -use ObserverTrait; -use EmitterTrait; +use Reflex::Trait::Observer; +use Reflex::Trait::Emitter; has tri_and => ( isa => 'Ttl::TriAnd', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => [qw(a b c)], ); has not => ( isa => 'Ttl::Not', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has out => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub BUILD { diff --git a/docs/Ttl/Un.pm b/docs/Ttl/Un.pm index 943ef3a..3a6033a 100644 --- a/docs/Ttl/Un.pm +++ b/docs/Ttl/Un.pm @@ -4,20 +4,20 @@ package Ttl::Un; use Moose; -extends 'Stage'; -use EmitterTrait; +extends 'Reflex::Object'; +use Reflex::Trait::Emitter; has in => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], event => 'change', ); has out => ( isa => 'Bool', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); 1; diff --git a/docs/eg-01-discrete-observer.pl b/docs/eg-01-discrete-observer.pl index 45efb01..24ecce7 100644 --- a/docs/eg-01-discrete-observer.pl +++ b/docs/eg-01-discrete-observer.pl @@ -2,39 +2,43 @@ # Watch another object, already created. # -# Create a Delay object that may emit events before it can be watched. -# Create a watcher after the fact, which then watches the Delay. +# Create a Reflex::Object that may emit events before it can be +# watched. Create a watcher after the fact, which then watches the +# Reflex::Timer. # # Warning: Events can be missed in a truly concurrent system if there -# is time between the creation of a watched object and registering -# its events' watchers. See eg-02-watched-new.pl for a safer -# alternative. +# is time between the creation of a watched object and registering its +# events' watchers. See eg-02-watched-new.pl for a safer alternative. # # TODO - Another option is to create an object in a stopped state, # then start it after watchers have been registered. +# +# Note: This is verbose syntax. More concise, convenient syntax has +# been developed and appears in later examples. use warnings; use strict; +use lib qw(lib); -use Stage; -use Delay; +use Reflex::Object; +use Reflex::Timer; use ExampleHelpers qw(tell); -tell("starting delay object"); -my $delay = Delay->new( interval => 1, auto_repeat => 1 ); +tell("starting timer object"); +my $timer = Reflex::Timer->new( interval => 1, auto_repeat => 1 ); tell("starting watcher object"); -my $watcher = Stage->new(); +my $watcher = Reflex::Object->new(); -tell("watcher watching delay"); +tell("watcher watching timer"); $watcher->observe( - observed => $delay, + observed => $timer, event => "tick", callback => sub { tell("watcher sees 'tick' event"); }, ); -# Run the underlying event loop. -POE::Kernel->run(); +# Run the objects until they are done. +Reflex::Object->run_all(); exit; diff --git a/docs/eg-02-observed-new.pl b/docs/eg-02-observed-new.pl index 23d9065..9f04edf 100644 --- a/docs/eg-02-observed-new.pl +++ b/docs/eg-02-observed-new.pl @@ -6,19 +6,23 @@ # no time between construction and observation where events may be # lost. This is equivalent to eg-01-discrete-observer.pl but without # the potential for races. +# +# Note: This is verbose syntax. More concise, convenient syntax has +# been developed and appears in later examples. use warnings; use strict; +use lib qw(lib); -use Stage; -use Delay; +use Reflex::Object; +use Reflex::Timer; use ExampleHelpers qw(tell); tell("starting watcher object"); -my $watcher = Stage->new( ); +my $watcher = Reflex::Object->new( ); -tell("starting delay object with integrated observation"); -my $delay = Delay->new( +tell("starting timer object with integrated observation"); +my $timer = Reflex::Timer->new( interval => 1, auto_repeat => 1, observers => [ @@ -32,6 +36,6 @@ ], ); -# Run the underlying event loop. -POE::Kernel->run(); +# Run the objects until they are done. +Reflex::Object->run_all(); exit; diff --git a/docs/eg-03-observer-roles.pl b/docs/eg-03-observer-roles.pl index 697fb9d..25adf05 100644 --- a/docs/eg-03-observer-roles.pl +++ b/docs/eg-03-observer-roles.pl @@ -2,35 +2,36 @@ # An observer's callbacks can be inferred by observation roles and the # event names that the observed object emits. In this example, the -# Delay object is given the role "waitron". Its "tick" events are -# routed to the observer's "on_waitron_dig" method. +# Reflex::Timer object is given the role "waitron". Its "tick" events +# are routed to the observer's "on_waitron_dig" method. +# +# In addition, the timer is also observed in the waitroff role. One +# timer may trigger multiple callbacks. use warnings; use strict; - -use Stage; -use Delay; -use ExampleHelpers qw(tell); +use lib qw(lib); # Define the watcher class. { package Watcher; use Moose; - extends 'Stage'; + extends 'Reflex::Object'; + use Reflex::Timer; use ExampleHelpers qw(tell); - has delay => ( - isa => 'Delay', + has timer => ( + isa => 'Reflex::Timer', is => 'rw', ); sub BUILD { my $self = $_[0]; - tell("watcher creates a delay with the waitron role"); - $self->delay( - Delay->new( + tell("watcher creates a timer with the waitron role"); + $self->timer( + Reflex::Timer->new( interval => 1, auto_repeat => 1, observers => [ @@ -43,9 +44,9 @@ ); # It's possible to mix and match. - tell("observing waitroff role, too"); + tell("observing timer as the waitroff role, too"); $self->observe_role( - observed => $self->delay(), + observed => $self->timer(), role => "waitroff", ); } @@ -59,11 +60,10 @@ } } -# Must not go out of scope. -# If the watcher goes out of scope, so does the Delay it's watching. -# If the Delay goes out of scope, its timers are cleared too. +# Main. -my $watcher_role = Watcher->new(); +# Watchers must not go out of scope. They stop watching if they do. +my $watcher = Watcher->new(); -POE::Kernel->run(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-04-inheritance.pl b/docs/eg-04-inheritance.pl index 481423b..b58d3d3 100644 --- a/docs/eg-04-inheritance.pl +++ b/docs/eg-04-inheritance.pl @@ -1,13 +1,17 @@ #!/usr/bin/env perl +use warnings; +use strict; +use lib qw(lib); + # An object's emitted events can also trigger methods in the subclass. # This example creates a UDP echo server using inheritance rather than # the composition archtectures in past examples. { - package UdpEchoPeer; + package Reflex::UdpPeer::Echo; use Moose; - extends 'UdpPeer'; + extends 'Reflex::UdpPeer'; sub on_my_datagram { my ($self, $args) = @_; @@ -31,8 +35,10 @@ } } +# Main. + my $port = 12345; -my $peer = UdpEchoPeer->new( port => $port ); +my $peer = Reflex::UdpPeer::Echo->new( port => $port ); print "UDP echo service is listening on port $port.\n"; -POE::Kernel->run(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-05-composition.pl b/docs/eg-05-composition.pl index 7bb79fa..55e9957 100644 --- a/docs/eg-05-composition.pl +++ b/docs/eg-05-composition.pl @@ -1,24 +1,28 @@ #!/usr/bin/env perl +use warnings; +use strict; +use lib qw(lib); + # An object's emitted events can also trigger methods in the subclass. # This example is a direct port of eg-04-inheritance.pl, but it uses a -# UdpPeer object rather than inheriting from the UdpPeer class. +# Reflex::UdpPeer object rather than inheriting from that class. { - package UdpEchoPeer; + package Reflex::UdpPeer::Echo; use Moose; - extends 'Stage'; - use UdpPeer; + extends 'Reflex::Object'; + use Reflex::UdpPeer; has peer => ( - isa => 'UdpPeer|Undef', + isa => 'Reflex::UdpPeer|Undef', is => 'rw', ); sub BUILD { my ($self, $args) = @_; $self->peer( - UdpPeer->new( + Reflex::UdpPeer->new( port => $args->{port}, observers => [ { @@ -52,8 +56,10 @@ } } +# Main. + my $port = 12345; -my $peer = UdpEchoPeer->new( port => $port ); +my $peer = Reflex::UdpPeer::Echo->new( port => $port ); print "UDP echo service is listening on port $port.\n"; -POE::Kernel->run(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-06-moose-roles.pl b/docs/eg-06-moose-roles.pl index ce69890..1b4bd78 100644 --- a/docs/eg-06-moose-roles.pl +++ b/docs/eg-06-moose-roles.pl @@ -1,13 +1,17 @@ #!/usr/bin/env perl +use warnings; +use strict; +use lib qw(lib); + # An object's emitted events can also trigger methods in the subclass. # This example creates a UDP echo server using a role rather than # inheritance. { - package UdpEchoPeer; + package Reflex::UdpPeer::Echo; use Moose; - with 'UdpPeerRole'; + with 'Reflex::Role::UdpPeer'; sub on_my_datagram { my ($self, $args) = @_; @@ -31,8 +35,10 @@ } } +# Main. + my $port = 12345; -my $peer = UdpEchoPeer->new( port => $port ); +my $peer = Reflex::UdpPeer::Echo->new( port => $port ); print "UDP echo service is listening on port $port.\n"; -POE::Kernel->run(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-07-wheel-run.pl b/docs/eg-07-wheel-run.pl index 860e71d..4b401bb 100644 --- a/docs/eg-07-wheel-run.pl +++ b/docs/eg-07-wheel-run.pl @@ -1,16 +1,20 @@ #!/usr/bin/perl +use warnings; +use strict; +use lib qw(lib); + # Demonstrate how wheels may be encapsulated in thin, # configuration-only subclasses. { package Runner; use Moose; - extends 'Stage'; - use WheelRun; + extends 'Reflex::Object'; + use Reflex::POE::Wheel::Run; has wheel => ( - isa => 'WheelRun|Undef', + isa => 'Reflex::POE::Wheel::Run|Undef', is => 'rw', ); @@ -18,7 +22,7 @@ my $self = shift; $self->wheel( - WheelRun->new( + Reflex::POE::Wheel::Run->new( Program => "$^X -wle 'print qq[pid(\$\$) moo(\$_)] for 1..10; exit'", observers => [ { @@ -62,6 +66,8 @@ } } +# Main. + my $runner = Runner->new(); -POE::Kernel->run(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-08-observer-trait.pl b/docs/eg-08-observer-trait.pl index 80b2b0a..b29d0c9 100644 --- a/docs/eg-08-observer-trait.pl +++ b/docs/eg-08-observer-trait.pl @@ -1,25 +1,29 @@ #!/usr/bin/perl +use warnings; +use strict; +use lib qw(lib); + # Demonstrate how wheels may be encapsulated in thin, # configuration-only subclasses. { package Runner; use Moose; - extends 'Stage'; - use WheelRun; - use ObserverTrait; + extends 'Reflex::Object'; + use Reflex::POE::Wheel::Run; + use Reflex::Trait::Observer; has child => ( - traits => ['Observer'], - isa => 'WheelRun|Undef', + traits => ['Reflex::Trait::Observer'], + isa => 'Reflex::POE::Wheel::Run|Undef', is => 'rw', ); sub BUILD { my $self = shift; $self->child( - WheelRun->new( + Reflex::POE::Wheel::Run->new( Program => "$^X -wle 'print qq[pid(\$\$) moo(\$_)] for 1..10; exit'", ) ); @@ -57,6 +61,8 @@ } } +# Main. + my $runner = Runner->new(); -POE::Kernel->run(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-09-emitter-trait.pl b/docs/eg-09-emitter-trait.pl index 9ad4412..5cfe200 100644 --- a/docs/eg-09-emitter-trait.pl +++ b/docs/eg-09-emitter-trait.pl @@ -1,25 +1,29 @@ #!/usr/bin/perl +use warnings; +use strict; +use lib qw(lib); + # Objects may emit events when their members are changed. { package Counter; use Moose; - extends 'Stage'; - use Delay; - use ObserverTrait; - use EmitterTrait; + extends 'Reflex::Object'; + use Reflex::Timer; + use Reflex::Trait::Observer; + use Reflex::Trait::Emitter; has count => ( - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], isa => 'Int', is => 'rw', default => 0, ); has ticker => ( - traits => ['Observer'], - isa => 'Delay|Undef', + traits => ['Reflex::Trait::Observer'], + isa => 'Reflex::Timer|Undef', is => 'rw', ); @@ -27,7 +31,7 @@ my $self = shift; $self->ticker( - Delay->new( + Reflex::Timer->new( interval => 1, auto_repeat => 1, ) @@ -43,10 +47,10 @@ { package Watcher; use Moose; - extends 'Stage'; + extends 'Reflex::Object'; has counter => ( - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], isa => 'Counter', is => 'rw', ); @@ -62,6 +66,8 @@ } } +# Main. + my $w = Watcher->new(); -Stage->run_all(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-10-setup.pl b/docs/eg-10-setup.pl index 302df2d..e4f9497 100644 --- a/docs/eg-10-setup.pl +++ b/docs/eg-10-setup.pl @@ -1,27 +1,33 @@ #!/usr/bin/env perl +use warnings; +use strict; +use lib qw(lib); + # Exercise the new "setup" option for Emitter and Observer traits. { package Counter; use Moose; - extends 'Stage'; - use Delay; - use ObserverTrait; - use EmitterTrait; + extends 'Reflex::Object'; + use Reflex::Timer; + use Reflex::Trait::Observer; + use Reflex::Trait::Emitter; has count => ( - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], isa => 'Int', is => 'rw', default => 0, ); has ticker => ( - traits => ['Observer'], - isa => 'Delay', + traits => ['Reflex::Trait::Observer'], + isa => 'Reflex::Timer', is => 'rw', - setup => sub { Delay->new( interval => 1, auto_repeat => 1 ) }, + setup => sub { + Reflex::Timer->new( interval => 1, auto_repeat => 1 ) + }, ); sub on_ticker_tick { @@ -33,10 +39,10 @@ { package Watcher; use Moose; - extends 'Stage'; + extends 'Reflex::Object'; has counter => ( - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], isa => 'Counter|Undef', is => 'rw', setup => sub { Counter->new() }, @@ -50,9 +56,8 @@ } } -use warnings; -use strict; +# Main. my $w = Watcher->new(); -Stage->run_all(); +Reflex::Object->run_all(); exit; diff --git a/docs/eg-11-poco-postback.pl b/docs/eg-11-poco-postback.pl index 6ba9be8..d9a2ab1 100644 --- a/docs/eg-11-poco-postback.pl +++ b/docs/eg-11-poco-postback.pl @@ -1,13 +1,17 @@ #!/usr/bin/env perl -# Exercise the Postback class, for passing postbacks into POE space. +use warnings; +use strict; +use lib qw(lib); + +# Exercise Reflex::POE::Postback, for passing postbacks into POE space. { package App; use Moose; - extends 'Stage'; - use Postback; + extends 'Reflex::Object'; + use Reflex::POE::Postback; use PoCoPostback; has component => ( @@ -20,7 +24,9 @@ $self->component( PoCoPostback->new() ); $self->component->request( - Postback->new($self, "on_component_result", { cookie => 123 }), + Reflex::POE::Postback->new( + $self, "on_component_result", { cookie => 123 } + ), ); } @@ -28,8 +34,8 @@ my ($self, $args) = @_; print( "Got component response:\n", - " pass-through cookie: $args->{passthrough}{cookie}\n", - " call-back result : $args->{callback}[0]\n", + " postback context: $args->{context}{cookie}\n", + " call-back result: $args->{response}[0]\n", ); # Ok, we're done. @@ -37,6 +43,8 @@ } } +# Main. + my $app = App->new(); $app->run_all(); exit; diff --git a/docs/eg-12-poco-event.pl b/docs/eg-12-poco-event.pl index d3ac656..5fc6251 100644 --- a/docs/eg-12-poco-event.pl +++ b/docs/eg-12-poco-event.pl @@ -1,13 +1,17 @@ #!/usr/bin/env perl -# Exercise the PoeEvent class, for passing events into POE space. +use warnings; +use strict; +use lib qw(lib); + +# Exercise Reflex::POE::Event, for passing events into POE space. { package App; use Moose; - extends 'Stage'; - use PoeEvent; + extends 'Reflex::Object'; + use Reflex::POE::Event; use PoCoEvent; has component => ( @@ -19,11 +23,12 @@ my $self = shift; $self->component( PoCoEvent->new() ); + # TODO - Make this more convenient. $self->run_within_session( sub { $self->component->request( - PoeEvent->new( - stage => $self, + Reflex::POE::Event->new( + object => $self, method => "on_component_result", context => { cookie => 123 }, ), @@ -36,8 +41,8 @@ my ($self, $args) = @_; print( "Got component response:\n", - " pass-through cookie: $args->{passthrough}{cookie}\n", - " call-back result : $args->{callback}[1][0]\n", + " event context : $args->{context}{cookie}\n", + " call-back result : $args->{response}[1][0]\n", ); # Ok, we're done. @@ -45,6 +50,8 @@ } } +# Main. + my $app = App->new(); $app->run_all(); exit; diff --git a/docs/eg-13-irc-bot.pl b/docs/eg-13-irc-bot.pl index ec1aae6..7e6efe7 100644 --- a/docs/eg-13-irc-bot.pl +++ b/docs/eg-13-irc-bot.pl @@ -1,18 +1,19 @@ #!/usr/bin/env perl # Using POE::Component::IRC. That component requires the user to -# register for events. The new PoeSession watcher is used to receive -# all events from the component. +# register for events. The new Reflex::POE::Session watcher is used +# to receive all events from the component. use strict; use warnings; +use lib qw(lib); { package Bot; use Moose; - extends 'Stage'; - use ObserverTrait; - use PoeSession; + extends 'Reflex::Object'; + use Reflex::Trait::Observer; + use Reflex::POE::Session; use POE qw(Component::IRC); @@ -22,9 +23,9 @@ ); has poco_watcher => ( - isa => 'PoeSession', + isa => 'Reflex::POE::Session', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], role => 'poco', ); @@ -33,14 +34,14 @@ $self->component( POE::Component::IRC->spawn( - nick => "stage$$", - ircname => "POE::Stage Test Bot", + nick => "reflex_$$", + ircname => "Reflex Test Bot", server => "10.0.0.25", ) || die "Drat: $!" ); $self->poco_watcher( - PoeSession->new( + Reflex::POE::Session->new( sid => $self->component()->session_id(), ) ); diff --git a/docs/fail-ttl-counter.pl b/docs/fail-ttl-counter.pl index 3c90913..0a51c32 100644 --- a/docs/fail-ttl-counter.pl +++ b/docs/fail-ttl-counter.pl @@ -1,13 +1,17 @@ #!/usr/bin/env perl +use warnings; +use strict; +use lib qw(lib); + { package Counter; use Moose; - extends 'Stage'; + extends 'Reflex::Object'; use Ttl::FlipFlop::T; use Ttl::HexDecoder; - use EmitterTrait; - use ObserverTrait; + use Reflex::Trait::Emitter; + use Reflex::Trait::Observer; # Create a four-bit counter using T flip-flops. # The counter schematic comes from Don Lancaster's _TTL Cookbook_. @@ -16,38 +20,38 @@ has t1 => ( isa => 'Ttl::FlipFlop::T', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], handles => ['clock'], ); has t2 => ( isa => 'Ttl::FlipFlop::T', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has t4 => ( isa => 'Ttl::FlipFlop::T', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has t8 => ( isa => 'Ttl::FlipFlop::T', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has decoder => ( isa => 'Ttl::HexDecoder', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has out => ( isa => 'Str', is => 'rw', - traits => ['Emitter'], + traits => ['Reflex::Trait::Emitter'], ); sub on_t1_q { @@ -100,25 +104,25 @@ { package Driver; use Moose; - extends 'Stage'; - use Delay; + extends 'Reflex::Object'; + use Reflex::Timer; has counter => ( isa => 'Counter', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); has clock => ( - isa => 'Delay', + isa => 'Reflex::Timer', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); sub BUILD { my $self = shift; $self->counter( Counter->new() ); - $self->clock( Delay->new( interval => 1, auto_repeat => 1 ) ); + $self->clock( Reflex::Timer->new( interval => 1, auto_repeat => 1 ) ); } sub on_clock_tick { @@ -136,5 +140,5 @@ ### Main. my $counter = Driver->new(); -Stage->run_all(); +Reflex::Object->run_all(); exit; diff --git a/docs/fail-ttl-simple.pl b/docs/fail-ttl-simple.pl index 758c027..b06d82a 100644 --- a/docs/fail-ttl-simple.pl +++ b/docs/fail-ttl-simple.pl @@ -1,17 +1,21 @@ #!/usr/bin/perl +use warnings; +use strict; +use lib qw(lib); + { package Breadboard; use Moose; - extends 'Stage'; - use ObserverTrait; + extends 'Reflex::Object'; + use Reflex::Trait::Observer; use Ttl::And; has ander => ( isa => 'Ttl::And', is => 'rw', - traits => ['Observer'], + traits => ['Reflex::Trait::Observer'], ); sub BUILD { @@ -28,5 +32,5 @@ } my $b = Breadboard->new(); -Stage->run_all(); +Reflex::Object->run_all(); exit; diff --git a/docs/Handle.pm b/docs/lib/Reflex/Handle.pm similarity index 96% rename from docs/Handle.pm rename to docs/lib/Reflex/Handle.pm index 5e60c34..9826b66 100644 --- a/docs/Handle.pm +++ b/docs/lib/Reflex/Handle.pm @@ -1,9 +1,9 @@ # Generic filehandle watcher. -package Handle; +package Reflex::Handle; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Scalar::Util qw(weaken); has handle => ( diff --git a/docs/lib/Reflex/Object.pm b/docs/lib/Reflex/Object.pm new file mode 100644 index 0000000..33b9bfb --- /dev/null +++ b/docs/lib/Reflex/Object.pm @@ -0,0 +1,12 @@ +package Reflex::Object; + +use Moose; +with 'Reflex::Role::Object'; + +# Composes the Reflex::Role::Object into a class. +# Does nothing of its own. + +no Moose; +__PACKAGE__->meta()->make_immutable(); + +1; diff --git a/docs/SignalChild.pm b/docs/lib/Reflex/PID.pm similarity index 92% rename from docs/SignalChild.pm rename to docs/lib/Reflex/PID.pm index 33cd3f1..d4d8f4b 100644 --- a/docs/SignalChild.pm +++ b/docs/lib/Reflex/PID.pm @@ -1,7 +1,7 @@ -package SignalChild; +package Reflex::PID; use Moose; -extends qw(Signal); +extends qw(Reflex::Signal); has '+name' => ( default => 'CHLD', diff --git a/docs/PoeEvent.pm b/docs/lib/Reflex/POE/Event.pm similarity index 52% rename from docs/PoeEvent.pm rename to docs/lib/Reflex/POE/Event.pm index ac6ca9d..7afe1c8 100644 --- a/docs/PoeEvent.pm +++ b/docs/lib/Reflex/POE/Event.pm @@ -1,11 +1,11 @@ -package PoeEvent; +package Reflex::POE::Event; use Moose; use Carp qw(croak); -has stage => ( +has object => ( is => 'ro', - isa => 'Stage', + isa => 'Reflex::Object', ); has method => ( @@ -24,12 +24,12 @@ sub BUILD { if ( $POE::Kernel::poe_kernel->get_active_session()->ID() ne - $self->stage()->session_id() + $self->object()->session_id() ) { croak( "When interfacing with POE at large, ", __PACKAGE__, " must\n", - "be created within a Stage's session. Perhaps invoke it within\n", - "the stage's run_within_session() method", + "be created within a Reflex::Object's session. Perhaps invoke it\n", + "within the object's run_within_session() method", ); } } @@ -38,10 +38,10 @@ sub deliver { my ($self, $args) = @_; $POE::Kernel::poe_kernel->post( - $self->stage()->session_id(), "call_gate_method", - $self->stage(), $self->method(), { - passthrough => $self->context(), - callback => [ @$args ], + $self->object()->session_id(), "call_gate_method", + $self->object(), $self->method(), { + context => $self->context(), + response => [ @$args ], } ); } diff --git a/docs/Postback.pm b/docs/lib/Reflex/POE/Postback.pm similarity index 83% rename from docs/Postback.pm rename to docs/lib/Reflex/POE/Postback.pm index 0fe6d5a..924a755 100644 --- a/docs/Postback.pm +++ b/docs/lib/Reflex/POE/Postback.pm @@ -1,4 +1,4 @@ -package Postback; +package Reflex::POE::Postback; # TODO - Not Moose, unless Moose allows us to create blessed coderefs. @@ -9,7 +9,7 @@ use Scalar::Util qw(weaken); my %owner_session_ids; sub new { - my ($class, $object, $method, $passthrough_args) = @_; + my ($class, $object, $method, $context) = @_; # TODO - Object owns component, which owns object? weaken $object; @@ -17,15 +17,15 @@ sub new { my $self = bless sub { $POE::Kernel::poe_kernel->post( $object->session_id(), "call_gate_method", $object, $method, { - passthrough => $passthrough_args, - callback => [ @_ ], + context => $context, + response => [ @_ ], }, ); }, $class; $owner_session_ids{$self} = $object->session_id(); $POE::Kernel::poe_kernel->refcount_increment( - $object->session_id(), "stage_postback" + $object->session_id(), "reflex_postback" ); # Double indirection sucks, but some libraries (like Tk) bless their @@ -45,7 +45,7 @@ sub DESTROY { my $session_id = delete $owner_session_ids{$self}; return unless defined $session_id; $POE::Kernel::poe_kernel->refcount_decrement( - $session_id, "stage_postback" + $session_id, "reflex_postback" ); undef; diff --git a/docs/PoeSession.pm b/docs/lib/Reflex/POE/Session.pm similarity index 93% rename from docs/PoeSession.pm rename to docs/lib/Reflex/POE/Session.pm index 3771ace..c7d61e5 100644 --- a/docs/PoeSession.pm +++ b/docs/lib/Reflex/POE/Session.pm @@ -1,7 +1,7 @@ -package PoeSession; +package Reflex::POE::Session; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Scalar::Util qw(weaken); use POE::Session; # for ARG0 diff --git a/docs/Wheel.pm b/docs/lib/Reflex/POE/Wheel.pm similarity index 97% rename from docs/Wheel.pm rename to docs/lib/Reflex/POE/Wheel.pm index 65b1cd0..d903b15 100644 --- a/docs/Wheel.pm +++ b/docs/lib/Reflex/POE/Wheel.pm @@ -1,6 +1,6 @@ -package Wheel; +package Reflex::POE::Wheel; use Moose; -extends 'Stage'; +extends 'Reflex::Object'; use Scalar::Util qw(weaken); use POE::Wheel; diff --git a/docs/WheelRun.pm b/docs/lib/Reflex/POE/Wheel/Run.pm similarity index 92% rename from docs/WheelRun.pm rename to docs/lib/Reflex/POE/Wheel/Run.pm index 819c06b..91f4727 100644 --- a/docs/WheelRun.pm +++ b/docs/lib/Reflex/POE/Wheel/Run.pm @@ -1,6 +1,6 @@ -package WheelRun; +package Reflex::POE::Wheel::Run; use Moose; -extends 'Wheel'; +extends 'Reflex::POE::Wheel'; use POE::Wheel::Run; # These are class methods, returning static class data. @@ -82,9 +82,9 @@ sub valid_params { # Also handle signals. -use SignalChild; +use Reflex::PID; has sigchild_watcher => ( - isa => 'SignalChild|Undef', + isa => 'Reflex::PID|Undef', is => 'rw', ); @@ -92,7 +92,7 @@ sub BUILD { my $self = shift; $self->sigchild_watcher( - SignalChild->new( + Reflex::PID->new( pid => $self->wheel()->PID(), observers => [ { diff --git a/docs/StageRole.pm b/docs/lib/Reflex/Role/Object.pm similarity index 94% rename from docs/StageRole.pm rename to docs/lib/Reflex/Role/Object.pm index d0060ba..0365d10 100644 --- a/docs/StageRole.pm +++ b/docs/lib/Reflex/Role/Object.pm @@ -1,4 +1,4 @@ -package StageRole; +package Reflex::Role::Object; use Moose::Role; @@ -19,6 +19,7 @@ our @CARP_NOT = (__PACKAGE__); #sub POE::Kernel::ASSERT_DEFAULT () { 1 } use POE; +use Reflex::POE::Session; # Disable a warning. POE::Kernel->run(); @@ -56,7 +57,7 @@ my $singleton_session_id = POE::Session->create( ### Signals. signal_happened => sub { - Signal->_deliver(@_[ARG0..$#_]); + Reflex::Signal->_deliver(@_[ARG0..$#_]); }, ### Cross-session emit() is converted into these events. @@ -88,9 +89,11 @@ my $singleton_session_id = POE::Session->create( _default => sub { my ($event, $args) = @_[ARG0, ARG1]; - return $event->deliver($args) if "$event" =~ /^PoeEvent(?:::|=)/; + return $event->deliver($args) if ( + "$event" =~ /^Reflex::POE::Event(?:::|=)/ + ); - return if PoeSession->deliver($_[SENDER]->ID, $event, $args); + return if Reflex::POE::Session->deliver($_[SENDER]->ID, $event, $args); # Unhandled event. # TODO - Anything special? @@ -102,23 +105,23 @@ my $singleton_session_id = POE::Session->create( # their IDs in different ARGn offsets, so we need a few of these. wheel_event_0 => sub { $_[CALLER_FILE] =~ m{/([^/.]+)\.pm}; - "Wheel$1"->_deliver(0, @_[ARG0..$#_]); + "Reflex::POE::Wheel:\:$1"->_deliver(0, @_[ARG0..$#_]); }, wheel_event_1 => sub { $_[CALLER_FILE] =~ m{/([^/.]+)\.pm}; - "Wheel$1"->_deliver(1, @_[ARG0..$#_]); + "Reflex::POE::Wheel:\:$1"->_deliver(1, @_[ARG0..$#_]); }, wheel_event_2 => sub { $_[CALLER_FILE] =~ m{/([^/.]+)\.pm}; - "Wheel$1"->_deliver(2, @_[ARG0..$#_]); + "Reflex::POE::Wheel:\:$1"->_deliver(2, @_[ARG0..$#_]); }, wheel_event_3 => sub { $_[CALLER_FILE] =~ m{/([^/.]+)\.pm}; - "Wheel$1"->_deliver(3, @_[ARG0..$#_]); + "Reflex::POE::Wheel:\:$1"->_deliver(3, @_[ARG0..$#_]); }, wheel_event_4 => sub { $_[CALLER_FILE] =~ m{/([^/.]+)\.pm}; - "Wheel$1"->_deliver(4, @_[ARG0..$#_]); + "Reflex::POE::Wheel:\:$1"->_deliver(4, @_[ARG0..$#_]); }, }, )->ID(); @@ -176,8 +179,14 @@ sub BUILD { my ($self, $args) = @_; foreach my $setup ( - (grep { $_->does('Emitter') } $self->meta()->get_all_attributes()), - (grep { $_->does('Observer') } $self->meta()->get_all_attributes()) + ( + grep { $_->does('Reflex::Trait::Emitter') } + $self->meta()->get_all_attributes() + ), + ( + grep { $_->does('Reflex::Trait::Observer') } + $self->meta()->get_all_attributes() + ) ) { my $callback = $setup->setup(); if (defined $callback) { diff --git a/docs/UdpPeerRole.pm b/docs/lib/Reflex/Role/UdpPeer.pm similarity index 90% rename from docs/UdpPeerRole.pm rename to docs/lib/Reflex/Role/UdpPeer.pm index 1949e01..1d95ebb 100644 --- a/docs/UdpPeerRole.pm +++ b/docs/lib/Reflex/Role/UdpPeer.pm @@ -1,9 +1,9 @@ # A UDP peer implemented as a role. -package UdpPeerRole; +package Reflex::Role::UdpPeer; use Moose::Role; -with 'StageRole'; -use Handle; +with 'Reflex::Role::Object'; +use Reflex::Handle; has port => ( isa => 'Int', @@ -11,7 +11,7 @@ has port => ( ); has handle => ( - isa => 'Handle|Undef', + isa => 'Reflex::Handle|Undef', is => 'rw', ); @@ -25,7 +25,7 @@ after 'BUILD' => sub { my $self = shift; $self->handle( - Handle->new( + Reflex::Handle->new( handle => IO::Socket::INET->new( Proto => 'udp', LocalPort => $self->port(), diff --git a/docs/Signal.pm b/docs/lib/Reflex/Signal.pm similarity index 97% rename from docs/Signal.pm rename to docs/lib/Reflex/Signal.pm index 8244906..588e1dc 100644 --- a/docs/Signal.pm +++ b/docs/lib/Reflex/Signal.pm @@ -1,7 +1,7 @@ -package Signal; +package Reflex::Signal; use Moose; -extends qw(Stage); +extends qw(Reflex::Object); use Scalar::Util qw(weaken); # A session may only watch a distinct signal once. diff --git a/docs/Delay.pm b/docs/lib/Reflex/Timer.pm similarity index 95% rename from docs/Delay.pm rename to docs/lib/Reflex/Timer.pm index 4cf343c..f973321 100644 --- a/docs/Delay.pm +++ b/docs/lib/Reflex/Timer.pm @@ -1,7 +1,7 @@ -package Delay; +package Reflex::Timer; use Moose; -extends qw(Stage); +extends qw(Reflex::Object); use Scalar::Util qw(weaken); has interval => ( diff --git a/docs/EmitterTrait.pm b/docs/lib/Reflex/Trait/Emitter.pm similarity index 89% rename from docs/EmitterTrait.pm rename to docs/lib/Reflex/Trait/Emitter.pm index ae804dd..af4b4c8 100644 --- a/docs/EmitterTrait.pm +++ b/docs/lib/Reflex/Trait/Emitter.pm @@ -1,4 +1,4 @@ -package EmitterTrait; +package Reflex::Trait::Emitter; use Moose::Role; use Scalar::Util qw(weaken); @@ -78,7 +78,7 @@ has setup => ( is => 'ro', ); -package Moose::Meta::Attribute::Custom::Trait::Emitter; -sub register_implementation { 'EmitterTrait' } +package Moose::Meta::Attribute::Custom::Trait::Reflex::Trait::Emitter; +sub register_implementation { 'Reflex::Trait::Emitter' } 1; diff --git a/docs/ObserverTrait.pm b/docs/lib/Reflex/Trait/Observer.pm similarity index 92% rename from docs/ObserverTrait.pm rename to docs/lib/Reflex/Trait/Observer.pm index 7e6ef38..638f1f9 100644 --- a/docs/ObserverTrait.pm +++ b/docs/lib/Reflex/Trait/Observer.pm @@ -1,4 +1,4 @@ -package ObserverTrait; +package Reflex::Trait::Observer; use Moose::Role; use Scalar::Util qw(weaken); @@ -90,7 +90,7 @@ has setup => ( # }, #); -package Moose::Meta::Attribute::Custom::Trait::Observer; -sub register_implementation { 'ObserverTrait' } +package Moose::Meta::Attribute::Custom::Trait::Reflex::Trait::Observer; +sub register_implementation { 'Reflex::Trait::Observer' } 1; diff --git a/docs/UdpPeer.pm b/docs/lib/Reflex/UdpPeer.pm similarity index 51% rename from docs/UdpPeer.pm rename to docs/lib/Reflex/UdpPeer.pm index 91f05ec..c9d9651 100644 --- a/docs/UdpPeer.pm +++ b/docs/lib/Reflex/UdpPeer.pm @@ -1,10 +1,10 @@ # A UDP peer. -package UdpPeer; +package Reflex::UdpPeer; use Moose; -with 'UdpPeerRole'; +with 'Reflex::Role::UdpPeer'; -# Composes the UdpPeerRole role into a class. +# Composes Reflex::Role::udpPeer into a class. # Does nothing of its own. no Moose; diff --git a/docs/requirements.otl b/docs/requirements.otl index f0e497a..a9f0754 100644 --- a/docs/requirements.otl +++ b/docs/requirements.otl @@ -1,4 +1,4 @@ -[_] 42% Framework Requirements +[_] 53% Framework Requirements About This document summarizes the best ideas from the patterns document. The patterns document tries to enumerate all available options. @@ -33,14 +33,15 @@ System designs that fit within these frameworks are elegant. Systems that wish to use other concepts are generally awkward. Adapters can connect between metaphors, but they should not be needed. - [_] 0% Namespace Requirements - [_] 0% Choose a short base name for the namespace. + [X] 100% Namespace Requirements + [X] 100% Choose a short base name for the namespace. Large class names are unwieldy. Objects should be under a single top-level namespace. What single top-level namespace should be used? Bacon - Basic Asynchronous Cooperative Object Networks? + Reflex ??? - [_] 0% Choose a relatively flat namespace for the framework. + [X] 100% Choose a relatively flat namespace for the framework. Excessive namespace nesting is unwieldy. The namespace should be organized. How should the namespace be organized? @@ -148,7 +149,7 @@ [_] 0% Message-scoped resources should be stored in the message's continuation. [_] 0% Message cancelation triggers associated resource cleanup. [_] 54% Common primitive classes must be provided. - [_] 54% Low-level event watchers. + [_] 41% Low-level event watchers. [X] 100% I/O [X] 100% Handle [_] 16% Time @@ -157,8 +158,9 @@ [X] 100% Repeat with drift. [_] 0% Repeat without drift. [_] 0% Cron. - [X] 100% Signals + [_] 50% Signals [X] 100% Signal + [_] 0% PID (SIGCHLD) [_] 0% What else? [_] 22% Primitive program pieces. [_] 0% Application @@ -170,9 +172,9 @@ [_] 0% TcpServer [X] 100% UdpPeer [_] 0% What else? Probably a lot! - [_] 87% POE Interfaces + [X] 100% POE Interfaces [X] 100% Wheel wrappers. - [_] 75% Generic Component shims. + [X] 100% Generic Component shims. [X] 100% Create a postback analog for components that expect postbacks. About Creates a coderef that, when called, posts a message to the object's session, with routing information back to the object. @@ -206,7 +208,7 @@ Dispatch Mechanism _default Events that are objects in the PoeEvent class are invoked to deliver themselves. - [X] 100% Session and optional event subscription. + [X] 100% Session subscription. About A client stage creates the component, to be used as a service. The client stage registers interest in the service's events. @@ -218,8 +220,9 @@ Sender Interest The object creates the component. The object registers interest in all events from the component. - [_] 0% Components that emit specific events require Wheel-like wrappers. - [_] 0% Is this worth supporting? + [X] 100% Components that emit specific events require Wheel-like wrappers. + [X] 100% Is this worth supporting? + No. The Session subscriber can detect any events emitted by the component. [_] 50% Optimizations. [X] 100% Only $kernel->call() when we need to switch sessions. [_] 0% Consolidate POE-specific code out into a single role.