State machine stack traces

Ovid on 2004-12-17T00:37:45

Guess what this is:

State: installed
{
  message => undef,
  result => 1
}

State: version
{
  message => undef,
  result => '1'
}

That's part of a state machine stacktrace. This should be on the CPAN soon. David and I (mostly David) have put together a state machine module that's actually user friendly. Here is the definition of the first two states:

    my $fail    = sub {! shift->result };
    my $succeed = sub {  shift->result } ;
    my @state_machine = (
        installed => {
            on_enter => sub { 
                my $machine = shift;
                $machine->set_result($self->_is_installed);
                $machine->set_message($self->app_name ." does not appear to be i
                  unless $machine->result;
            },
            rules  => [
                fail    => $fail,
                version => $succeed,
            ],
        },
        version => {
            on_enter => sub { 
                my $machine = shift;
                $machine->set_result($self->_is_required_version);
                unless ($machine->result) {
                    my $required = $self->build->_required_version;
                    my $actual   = $self->info->version;
                    $machine->set_message($self->app_name 
                        . " required version $required but you have $actual");
                }
            },
            rules  => [
                fail       => $fail,
                createlang => $succeed,
            ],
        },

David has already released FSA::Rules, , but with the new version that's being created, there will be a lot more power, including the stack traces shown. Frankly, I'm surprised that the machines currently available on the CPAN are not this useful. Now that I see how they work, I can't believe that I've not paid attention to them before. They make (some) complex tasks so much easier. I'll just have to avoid the temptation to reach for them when I don't need them.