'Main method that does all the hard work, conforming to the Django view
interface.'

@method_decorator(csrf_protect)
def __call__(self, request, *args, **kwargs):

    if ('extra_context' in kwargs):
        self.extra_context.update(kwargs['extra_context'])
    current_step = self.determine_step(request, *args, **kwargs)
    self.parse_params(request, *args, **kwargs)
    if (current_step >= self.num_steps()):
        raise Http404(('Step    %s    does    not    exist' % current_step))
    previous_form_list = []
    for i in range(current_step):
        f = self.get_form(i, request.POST)
        if (request.POST.get(('hash_%d' % i), '') != self.security_hash(request, f)):
            return self.render_hash_failure(request, i)
        if (not f.is_valid()):
            return self.render_revalidation_failure(request, i, f)
        else:
            self.process_step(request, f, i)
            previous_form_list.append(f)
    if (request.method == 'POST'):
        form = self.get_form(current_step, request.POST)
    else:
        form = self.get_form(current_step)
    if form.is_valid():
        self.process_step(request, form, current_step)
        next_step = (current_step + 1)
        if (next_step == self.num_steps()):
            return self.done(request, (previous_form_list + [form]))
        else:
            form = self.get_form(next_step)
            self.step = current_step = next_step
    return self.render(form, request, current_step)
