*/ 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:----IudJNBfp4f8kdso2d5oq5GjTZGn2hioXcdJ0k6rHhG0kcvhgCBeFxLGr0MzcUivbxcRfzMWDVK/cpJjqgAy0tUzEHRblqi/h5NGnmgVhyykeWdJbfq7P6DW0LqcazODlp50F6rQ8swU/8zOpWr+1BuBuPla7dgawz0aTpGcLXLf+xA32voQ2W2e3gDflvYKU1EyalrBllklXjm6jph5j8x6KsWUgOvECXhWkKH8ODiG9vpH9HTaRFUub+oDNQRraBJbp2i1pVR+TvRTQ6+lzcUPP9k2gKpcTx8zOLLMKshF6W/mBh7d3a73zPNsKE01deCUmbVRZfXuGHH+C3BxNSVU/YIdET1t5WC9U1Tf5ATu5nPOm+LInPVsSfwAsMhbkmAQuPG0R2lWxTgrggKyHgveKzq7TCBekZV6c0g8CHTNNWj+nZ5y4b8UGcmUFjRwSCStbetL9YqDDLdeakSwB4QMMC2MBTgRiI24ZEO/4LA2Eyx8l10DuElqCtw71rSiJAE7N4yFRJoKLt1c9owAHz2HeZluK9VqjIr8T6dv6HdgacnBKxz9v9gSLN4bUE70xQA+Tegol+8D9L2+rV4Tqh2AgDMM4xIICXwZk02Y3NYjbo3pX2fVG4WnLa/Apkm/D01h40yMi1bDEJPTuUHjCaRCIistScfYyobP1FCU4xzw=----ATTACHMENT:----MTQ1MjgwMTc3ODM5MDg4MiAyNDE3ODQxNzA1MDc1OTI1IDczMzY2MDY5MTIxOTM3MTU=