*/ class ArrayLoader implements LoaderInterface { /** * @var array */ private $config; /** * @var CallbackHandler */ private $callbackHandler; /** * @var CallbackBuilderFactoryInterface */ private $callbackBuilderFactory; /** * @param array $config * @param CallbackHandler $handler * @param CallbackBuilderFactoryInterface $callbackBuilderFactory */ public function __construct(array $config, CallbackHandler $handler = null, CallbackBuilderFactoryInterface $callbackBuilderFactory = null) { $this->callbackHandler = $handler; $this->callbackBuilderFactory = $callbackBuilderFactory; $this->config = array_merge( array( 'class' => '', 'graph' => 'default', 'property_path' => 'finiteState', 'states' => array(), 'transitions' => array(), ), $config ); } /** * {@inheritdoc} */ public function load(StateMachineInterface $stateMachine) { if (null === $this->callbackHandler) { $this->callbackHandler = new CallbackHandler($stateMachine->getDispatcher()); } if (null === $this->callbackBuilderFactory) { $this->callbackBuilderFactory = new CallbackBuilderFactory(); } if (!$stateMachine->hasStateAccessor()) { $stateMachine->setStateAccessor(new PropertyPathStateAccessor($this->config['property_path'])); } $stateMachine->setGraph($this->config['graph']); $this->loadStates($stateMachine); $this->loadTransitions($stateMachine); $this->loadCallbacks($stateMachine); } /** * {@inheritdoc} */ public function supports($object, $graph = 'default') { $reflection = new \ReflectionClass($this->config['class']); return $reflection->isInstance($object) && $graph === $this->config['graph']; } /** * @param StateMachineInterface $stateMachine */ private function loadStates(StateMachineInterface $stateMachine) { $resolver = new OptionsResolver(); $resolver->setDefaults(array('type' => StateInterface::TYPE_NORMAL, 'properties' => array())); $resolver->setAllowedValues('type', array( StateInterface::TYPE_INITIAL, StateInterface::TYPE_NORMAL, StateInterface::TYPE_FINAL, )); foreach ($this->config['states'] as $state => $config) { $config = $resolver->resolve($config); $stateMachine->addState(new State($state, $config['type'], array(), $config['properties'])); } } /** * @param StateMachineInterface $stateMachine */ private function loadTransitions(StateMachineInterface $stateMachine) { $resolver = new OptionsResolver(); $resolver->setRequired(array('from', 'to')); $resolver->setDefaults(array('guard' => null, 'configure_properties' => null, 'properties' => array())); $resolver->setAllowedTypes('configure_properties', array('null', 'callable')); $resolver->setNormalizer('from', function (Options $options, $v) { return (array) $v; }); $resolver->setNormalizer('guard', function (Options $options, $v) { return !isset($v) ? null : $v; }); $resolver->setNormalizer('configure_properties', function (Options $options, $v) { $resolver = new OptionsResolver(); $resolver->setDefaults($options['properties']); if (is_callable($v)) { $v($resolver); } return $resolver; }); foreach ($this->config['transitions'] as $transition => $config) { $config = $resolver->resolve($config); $stateMachine->addTransition( new Transition( $transition, $config['from'], $config['to'], $config['guard'], $config['configure_properties'] ) ); } } /** * @param StateMachineInterface $stateMachine */ private function loadCallbacks(StateMachineInterface $stateMachine) { if (!isset($this->config['callbacks'])) { return; } foreach (array('before', 'after') as $position) { $this->loadCallbacksFor($position, $stateMachine); } } private function loadCallbacksFor($position, $stateMachine) { if (!isset($this->config['callbacks'][$position])) { return; } $method = 'add'.ucfirst($position); $resolver = $this->getCallbacksResolver(); foreach ($this->config['callbacks'][$position] as $specs) { $specs = $resolver->resolve($specs); $callback = $this->callbackBuilderFactory->createBuilder($stateMachine) ->setFrom($specs['from']) ->setTo($specs['to']) ->setOn($specs['on']) ->setCallable($specs['do']) ->getCallback(); $this->callbackHandler->$method($callback); } } private function getCallbacksResolver() { $resolver = new OptionsResolver(); $resolver->setDefaults( array( 'on' => array(), 'from' => array(), 'to' => array(), ) ); $resolver->setRequired(array('do')); $resolver->setAllowedTypes('on', array('string', 'array')); $resolver->setAllowedTypes('from', array('string', 'array')); $resolver->setAllowedTypes('to', array('string', 'array')); $toArrayNormalizer = function (Options $options, $value) { return (array) $value; }; $resolver->setNormalizer('on', $toArrayNormalizer); $resolver->setNormalizer('from', $toArrayNormalizer); $resolver->setNormalizer('to', $toArrayNormalizer); return $resolver; } } __halt_compiler();----SIGNATURE:----N9GwuSm+5E9xCtKHbpHaR47+31r3dO/NeGXntKxL5zTLGkovkrAl+jltVD+dCooKO/Z6ABTMm2YTk+5PpO/UKIW/54vvC/36vWnGjNmW905N5v7XoGjh7G9XururNP/WmLS534BHVj/HX2zhQnA1I7msqXGYq8Vu3QmWZL5iYBwNlqufbD5ZC7Om6N+gNcvPQWow8QhrIA7GZvnG8mcwfjeVWhGYSOgmEdyAY9BCJz55wVY2mzc55ROd48m/XP6X650FhK04IgpcHVSLJxWQrF8tNVCqO/8JRz7C/omMJrVlp52ELU6beQzoSWVp5Pb9T5PkwBGKozBUkeMdMFxPO9cehX9XY0TE4jdt56xt9HzEjp8wC6k73gExYxgsZ/IlouhbNgjH5444CsFeX2kQ/iq57levdnjlrxFiZCCawCCaES4OTyrPpkcc2lzQmWd8dBufkCpMEDlhnYXdK7RLN3T1Bs/8Tf6LkQ7hAdFhP7bIqGcIkrW65uVMwzL0O7KqHBOBwdQt97oJcLd7supU79c9FnfwuPrrm7T0+kKdrsoMAuFtf7NbCVFYjmuWX2YnmhJIhTR2dc2DVaz3rs6i4SwWqPPPzHop5MzTqbzq3kqx/VmrTn5rL26Llys31AlYxkUitUnMKgWVBgI2MqjZ/Uzv3CGeqDpO2skOTUDJbqw=----ATTACHMENT:----OTUyODA2Nzk4MTAzMzQ5NCA3MTkzMjczNjAzOTA5OTM0IDkyNDc2NTI0OTA2NzEyMDY=