protected function addOrUpdateChild( $handle, $type, array $props = [ ] )
    {
        $this->log( "Adding/updating child '{$handle}' of type {$type}", LogLevel::DEBUG );
        if (!isset( $this->childComponents[ $handle ] )) {
            if( ! class_exists( $type ) ){
                throw new \Exception( "Class '{$type}' for sub-component  does not exist." );
            }
            $child = new $type( $handle, $this, $this->exec, $this->logger );
            $this->childComponents[ $handle ] = $child;
        }else {
            // exec, di and logger are set recursively in rehydrate()
            $child = $this->childComponents[ $handle ];
        }
        $child->updateProps( $props );
        $child->updateState();
    }