The build process for the next version of Bricolage was becoming too complicated. Because we want it to be considerably easier to install, we're putting a lot of effort into ensuring that everything "just works." My code was getting too complex handling all of the rules so we're making the switch to a DFA engine and simply describing what to do when particular conditions occur. Unfortunately, DFA::Simple has a rather confusing interface and even after reading the Perl.com article about it I didn't quite "get" it. That led me to rewrite the interface to something I can actually use. Here's how to play ping-pong with a state machine:
my ($goto, $count) = ('', 0); my %state_machine = ( ping => { enter => sub { $goto = 'pong' }, leave => sub { warn "leaving state 'ping'" }, goto => [ # goto when and do this pong => [sub {'pong' eq $goto}, sub {$count++}], ], }, pong => { enter => sub { $goto = 'ping' }, leave => sub { warn "leaving state 'pong'" }, goto => [ ping => [sub {'ping' eq $goto}, sub {$count++}], ] } ); my $dfa = Bric::Util::DFA->new( \%state_machine, 'ping', # state to start in sub {$count >= 20} # done when true ); $dfa->next_state while ! $dfa->done;
Yeah, it needs some work, but it's much easier for me to understand.