/** * @param SimpleXMLElement $xml * @param StateMachine $sm * @return static */ public static function fromXml(SimpleXMLElement $xml, StateMachine $sm) { $rVal = new static(); // Attach the statemachine $rVal->sm = $sm; // Value and Label $rVal->value = (string) $xml->attributes()->value; $rVal->label = (string) $xml->attributes()->label; // Load events foreach ($xml->event as $eventXml) { $rVal->events[] = Event::fromXml($eventXml, $sm, $rVal); } // Load timeouts foreach ($xml->timeout as $timeoutXml) { $rVal->timeouts[] = Timeout::fromXml($timeoutXml, $sm, $rVal); } // Enter Commands XML fragments $enterXml = !empty($xml->enter) ? $xml->enter[0]->command : []; foreach ($enterXml as $item) { $rVal->enter[] = $item; } // Exit Commands XML fragments $exitXml = !empty($xml->exit) ? $xml->exit[0]->command : []; foreach ($exitXml as $item) { $rVal->exit[] = $item; } $rVal->isInitial = $sm->getInitialStateValue() === $rVal->value; $rVal->isFinal = empty($rVal->events); return $rVal; }