/// <summary>
        /// Invoked when a step is accessed on the url,
        /// i.e. http://host/mywizard/firststep.rails and
        /// when an inner action is invoked like http://host/mywizard/firststep-save.rails
        /// </summary>
        /// <param name="engineContext">The engine context.</param>
        /// <param name="controller">The controller.</param>
        /// <param name="controllerContext">The controller context.</param>
        private object OnStepActionRequested(IEngineContext engineContext, IController controller, IControllerContext controllerContext)
        {
            if (currentStepInstance != null && !HasRequiredSessionData(engineContext, controller, controllerContext))
            {
                StartWizard(engineContext, controller, controllerContext, false);
            }

            controllerContext.SelectedViewName = null;

            var wizController = (IWizardController)controller;

            var wizardName  = WizardUtils.ConstructWizardNamespace(controllerContext);
            var currentStep = (String)engineContext.Session[wizardName + "currentstep"];

            // If OnBeforeStep returns false we stop
            if (!wizController.OnBeforeStep(wizardName, currentStep, currentStepInstance))
            {
                return(null);
            }

            var stepMetaDescriptor =
                engineContext.Services.ControllerDescriptorProvider.BuildDescriptor(currentStepInstance);

            // Record the step we're working with
            WizardUtils.RegisterCurrentStepInfo(engineContext, controller, controllerContext, currentStepInstance.ActionName);

            try
            {
                var stepContext =
                    engineContext.Services.ControllerContextFactory.Create(
                        controllerContext.AreaName, controllerContext.Name, innerAction,
                        stepMetaDescriptor, controllerContext.RouteMatch);
                stepContext.PropertyBag = controllerContext.PropertyBag;

                SetUpWizardHelper(engineContext, wizController, currentStepInstance, stepContext);

                // IsPreConditionSatisfied might need the controller's context
                if (currentStepInstance is Controller)
                {
                    ((Controller)currentStepInstance).Contextualize(engineContext, stepContext);
                }

                // The step cannot be accessed in the current state of matters
                if (!currentStepInstance.IsPreConditionSatisfied(engineContext))
                {
                    return(null);
                }

                currentStepInstance.Process(engineContext, stepContext);

                return(null);
            }
            finally
            {
                wizController.OnAfterStep(wizardName, currentStep, currentStepInstance);
            }
        }