public function resolve(VariationContext $variationContext)
    {
        // run variation providers
        $variationContext = $this->variationProviderCollection->reduce(
            function (VariationContext $context, VariationProviderInterface $variationProvider) {
                return $variationProvider->hydrateContext($context) ?: $context;
            },
            $variationContext
        );

        // requires theme as context option : theme is variation namespace
        if (empty($variationContext->theme)) {
            throw new \InvalidArgumentException('Current theme name is required into context under "theme" key.');
        }
        $variationNamespace = $variationContext->theme;
        unset($variationContext->theme);

        // conditions resolution
        $variationConfig = array();
        foreach ($this->variationConfigs->get($variationNamespace) as $namespace => $elements) {
            $variationConfig[$namespace] = array();
            foreach ($elements as $element => $config) {
                $variationConfig[$namespace][$element] = array_diff_key(
                    $config, array('variations' => true)
                );
                if (empty($config['variations'])) {
                    continue;
                }
                $elementConfig = &$variationConfig[$namespace][$element];
                foreach ($config['variations'] as $elementVariationConfig) {
                    if ($this->expressionParser->evaluate(
                        $elementVariationConfig['_if'],
                        $variationContext->normalize()
                    )) {
                        $elementConfig = array_replace_recursive(
                            $elementConfig,
                            $elementVariationConfig['_then']
                        );
                        if (!empty($elementVariationConfig['_last'])) {
                            break;
                        }
                    }
                    // elseif (!empty($elementVariationConfig['_else'])) {
                    //     if (!empty($elementVariationConfig['_else']['disabled'])) {
                    //         unset($variationConfig[$namespace][$element]);
                    //         break;
                    //     }
                    //     $elementConfig = array_replace_recursive(
                    //         $elementConfig,
                    //         $elementVariationConfig['_else']
                    //     );
                    //     if (!empty($elementVariationConfig['_last'])) {
                    //         break;
                    //     }
                    // }
                }
            }
        }

        return new Variation($variationConfig, $this->propertyAccessor);
    }