public function process()
    {
        $context = $this->getContext();
        $templateProcessing = $this->getComponent();
        $trialCount = 0;
        
        // Make a copy of possibly impacted variables.
        $impactedVariables = Utils::templateProcessingImpactedVariables($templateProcessing);
        
        $tplVarCopies = array();
        foreach ($impactedVariables as $varIdentifier) {
            $tplVarCopies[] = clone $context->getVariable($varIdentifier);
        }
        
        do {
            $validConstraints = true;
            
            try {
                $trialCount++;
                
                foreach ($templateProcessing->getTemplateRules() as $rule) {
                    $processor = $this->getRuleProcessorFactory()->createProcessor($rule);
                    $processor->setState($context);
                    $processor->process();
                    $this->trace($rule->getQtiClassName() . ' executed.');
                }
            } catch (RuleProcessingException $e) {
                if ($e->getCode() === RuleProcessingException::EXIT_TEMPLATE) {
                    $this->trace('Termination of template processing.');
                } else if ($e->getCode() === RuleProcessingException::TEMPLATE_CONSTRAINT_UNSATISFIED) {
                    $this->trace('Unsatisfied template constraint.');
                    
                    // Reset variables with their originals.
                    foreach ($tplVarCopies as $copy) {
                        $context->getVariable($copy->getIdentifier())->setValue($copy->getDefaultValue());
                        $context->getVariable($copy->getIdentifier())->setDefaultValue($copy->getDefaultValue());
                        
                        if ($copy instanceof ResponseVariable) {
                            $context->getVariable($copy->getIdentifier())->setCorrectResponse($copy->getCorrectResponse());
                        }
                    }

                    $validConstraints = false;
                } else {
                    throw $e;
                }
            }
        } while ($validConstraints === false && $trialCount < 100);
    }