public function render($zoneName, array $parameters = array())
    {
        $context = $this->contextStack->getCurrent();
        $template = $context->getTemplate();

        $zoneType = $template->getTemplateType()->getZoneTypes()
            ->search(array('name' => $zoneName))
            ->first()
        ;
        if (!$zoneType) {
            throw new InvalidZoneException(sprintf(
                'Any "%s" zone defined into "%s" template. Check your configuration.',
                $zoneName,
                $template->getTemplateType()->getName()
            ));
        }

        // templates to guess components in
        $templates = new TemplateCollection(array($template));
        if (($globalTemplate = $template->getGlobalTemplate())
            && $context->isZoneVirtual($zoneName)) {             // virtual ? try to get global template components
            $templates->add($globalTemplate);
        }

        // render component into zone
        $aggregationConfig = $context->getZoneAggregation($zoneName);
        if (!$aggregationConfig) {
            throw new InvalidZoneException(sprintf(
                'The zone "%s" isn\'t registred. Check your configuration.',
                $zoneName
            ));
        }

        $aggregationType = $aggregationConfig['type'];

        if (!isset($this->aggregators[$aggregationType])) {
            throw new \InvalidArgumentException(sprintf(
                'Aggregation "%s" isnt registered, get one of these : ["%s"]',
                $aggregationType,
                implode('", "', array_keys($this->aggregators))
            ));
        }

        return $this->aggregators[$aggregationType]->aggregate(
            $templates->reduce(function ($carry, TemplateInterface $template) use ($zoneType, $parameters) {

                // already hydrated ?
                if (!empty($carry)) {
                    return $carry;
                }

                // look for requested zone into current template
                $zone = $template->getZones()
                    ->search(array('zoneType' => $zoneType))
                    ->first()
                ;
                if (!$zone) {  // zone is not instantiated in this template, so empty string;
                    return $carry;
                }

                return $zone->getComponents()
                    ->map(function (ComponentInterface $component) use ($zone, $parameters) {
                        return $this->componentDecorator
                            ->prepareFromCurrentContext($zone, $component)
                            ->render($parameters)
                        ;
                    })
                    ->toArray()
                ;
            }, []),
            $aggregationConfig
        );
    }