class ExecutionNodeRunner implements SubstepsRunner {

    public RootNode prepareExecutionConfig(final Config config , final Syntax syntax, final TestParameters parameters,
                                           final SetupAndTearDown setupAndTearDown ,
                                           final MethodExecutor methodExecutorToUse,
                                           TagManager nonFatalTagmanager ) {


        final ExecutionNodeTreeBuilder nodeTreeBuilder = new ExecutionNodeTreeBuilder(parameters, config);

        // building the tree can throw critical failures if exceptions are found
        this.rootNode = nodeTreeBuilder.buildExecutionNodeTree(NewSubstepsExecutionConfig.getDescription(config));

        setupExecutionListeners(NewSubstepsExecutionConfig.getExecutionListenerClasses(config));



        if (NewSubstepsExecutionConfig.isCheckForUncalledAndUnused(config)) {
            processUncalledAndUnused(syntax, NewSubstepsExecutionConfig.getDataOutputDirectory(config));
        }

        ExecutionContext.put(Scope.SUITE, INotificationDistributor.NOTIFIER_DISTRIBUTOR_KEY,
                this.notificationDistributor);


        this.nodeExecutionContext = new RootNodeExecutionContext(this.notificationDistributor,
                Lists.<SubstepExecutionFailure>newArrayList(), setupAndTearDown, nonFatalTagmanager,
                methodExecutorToUse);

        return this.rootNode;

    }

}