NAME

Machine::State::Simple - Simple State Machine DSL

VERSION

version 0.05

SYNOPSIS

package LightSwitch;

use Machine::State::Simple -dsl;

# light-switch circular-state example

topic 'typical light switch';

in_state 'is_off' => ( when => { turn_on => 'is_on' } );
at_state 'is_on'  => ( when => { turn_off => 'is_off' } );

sub _before_turn_on {
    my ($trans, $state, @args) = @_;
    # do something; maybe plug it in
}

sub _during_turn_on {
    my ($trans, $state, @args) = @_;
    # do something; maybe turn the knob or pull the lever
}

sub _after_turn_on {
    my ($trans, $state, @args) = @_;
    # do something else; maybe change adjust the positioning
}

package main;

my $lightswitch = LightSwitch->new;

$lightswitch->apply('turn_off');
$lightswitch->status; # is_off

DESCRIPTION

Machine::State::Simple is a micro-framework for defining simple state machines using Machine::State. Machine::State allows you to define a process, model interactions, and enforce the integrity of those interactions. State machines can also be used as a system for processing and reasoning about long-running asynchronous transactions. As an example of the functionality provided by this DSL, the follow is a demonstration of modeling a fictitious call-center process modeled using Machine::State::Simple. This library is a Moose-based implementation of the State::Machine library.

package CallCenter::Workflow::TelephoneCall;

use Machine::State::Simple -dsl;

topic 'support telephone call';

# initial state
at_state ringing => (
    # next transition
    next => 'connect',

    # applicable transitions
    when => {
        hangup  => 'disconnected', # transition -> resulting state
        connect => 'connected',    # transition -> resulting state
    }
);

in_state connected => (
    next => 'request_dept',
    when => {
        hangup       => 'disconnected',
        request_dept => 'transferred',
    }
);

in_state transferred => (
    next => 'answer',
    when => {
        hangup    => 'disconnected',
        voicemail => 'disconnected',
        answer    => 'answered',
    }
);

in_state answered => (
    next => 'hangup',
    when => {
        hangup => 'disconnected'
    }
);

in_state 'disconnected'; # end-state (cannot transition from)

EXPORTS

-dsl

The dsl export group exports all functions instrumental in modeling a simple state machine. The following is a list of functions exported by this group:

  • at_state

  • in_state

  • topic

FUNCTIONS

at_state

at_state name => (%attributes);

at_state answered => (when => { hangup => 'disconnected' });
# using the telephone example provided in the description, this state
# definition can be read as ... a $state (answered) $topic (support
# telephone call) $transition (hangup) and is now $state (disconnected)

The at_state function is analogous to the in_state function and additionally denotes that it's state definition is the root state (starting point).

in_state

in_state name => (%attributes);

in_state connected => (when => { request_dept => 'transferred' });
# using the telephone example provided in the description, this state
# definition can be read as ... a $state (connected) $topic (support
# telephone call) $transition (request_dept) and is now $state (transferred)

The in_state function defines a state and optionally it's transitions. The in_state function requires a state name as it's first argument, and optionally a list of attributes that will be used to configure other state behavior. The value of the when attribute should be a hashref whose keys are names of transitions, and whose values are names of states.

topic

topic 'process credit card';

The topic function takes an arbitrary string which describes the purpose or intent of the state machine.

AUTHOR

Al Newkirk <anewkirk@ana.io>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Al Newkirk.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.