awerd/process

Awesome State Machine Library

1.0.3 2019-05-24 13:44 UTC

This package is auto-updated.

Last update: 2024-04-25 06:56:37 UTC


README

Awesome State Machine Library

  use Awerd\Process\StateMachine;
  use Awerd\Process\Transition;
  use Awerd\Process\State;

  class DomainObject {

      public $state = 'initial';

  }

  $object = new DomainObject();

  $stateMachine = new StateMachine($object);

  $stateMachine->setGetter(function (DomainObject $object) {
      return $object->state;
  });

  $stateMachine->setSetter(function (DomainObject $object, Transition $transition) {
      $object->state = $transition->to->name;
  });

  $stateMachine->addState($initial = new State('initial'));
  $stateMachine->addState($working = new State('working'));
  $stateMachine->addState($complete = new State('complete'));

  $stateMachine->addTransition($initialWorking = new Transition('initial-working', $initial, $working));
  $stateMachine->addTransition($workingComplete = new Transition('working-complete', $working, $complete));
  $stateMachine->addTransition($completeWorking = new Transition('complete-working', $complete, $working));

  var_dump($stateMachine->getCurrentState()->name); // initial

  var_dump($stateMachine->canTransit($initialWorking)); // true
  var_dump($stateMachine->canTransit($workingComplete)); // false

  var_dump($stateMachine->availableTransitions()); // [$initialWorking]

  $stateMachine->transit($initialWorking);

  var_dump($stateMachine->getCurrentState()->name); // working