/**
  * Return the this object's path in the current component hierarchy
  * @return string
  */
 protected function getPath()
 {
     if (null === $this->parent) {
         return null;
     }
     if (null !== ($pPath = $this->parent->getPath())) {
         return $pPath . '.' . $this->handle;
     } else {
         return $this->handle;
     }
 }
 function testNestedSetAndGetStateExec()
 {
     // Optional off
     $props = ['anyTypeRequired' => 1, 'anyTypeRequired2' => 2, 'boolRequired' => true, 'boolRequired2' => false, 'intRequired' => 4, 'doubleRequired' => 1.1, 'floatRequired' => 1.2, 'stringRequired' => 'string', 'name' => 'someone', 'arrayRequired' => [], 'objectRequired' => new SomeClass(), 'resourceRequired' => fopen("/tmp", 'r'), 'callableRequired' => function () {
     }, 'SomeClassRequired' => new SomeClass()];
     $execHelper = new ExecHelper();
     $log = new MemoryLogger();
     $view = new HelloViewComponent(null, null, $execHelper, $log);
     $view->updateView($props);
     $outObj = $view->render("world.setState", ['something' => 5]);
     // Multiplies multiplier * props['intRequired']
     $this->assertEquals("OK", $outObj->content);
     $viewSer = $view->dehydrate();
     // Next page
     $view = AbstractViewComponent::rehydrate($viewSer, $execHelper, null, $log);
     $view->updateView($props);
     $outObj = $view->render("world.getState");
     // Multiplies multiplier * props['intRequired']
     //print_r( $log->messages );
     $this->assertEquals(5, $outObj->content);
 }