/**
  * Generate the ESI block
  *
  * @param  Varien_Object $esiData
  * @return Mage_Core_Block_Template|null
  */
 protected function _getEsiBlock($esiData)
 {
     $block = null;
     Varien_Profiler::start('turpentine::controller::esi::_getEsiBlock');
     foreach ($esiData->getSimpleRegistry() as $key => $value) {
         Mage::register($key, $value, true);
     }
     foreach ($esiData->getComplexRegistry() as $key => $data) {
         $value = Mage::getModel($data['model']);
         if (!is_object($value)) {
             Mage::helper('turpentine/debug')->logWarn('Failed to register key/model: %s as %s(%s)', $key, $data['model'], $data['id']);
             continue;
         } else {
             $value->load($data['id']);
             Mage::register($key, $value, true);
         }
     }
     $layout = Mage::getSingleton('core/layout');
     // dispatch event for adding handles to layout update
     Mage::dispatchEvent('controller_action_layout_load_before', array('action' => $this, 'layout' => $layout));
     $layoutUpdate = $layout->getUpdate();
     $layoutUpdate->load($this->_swapCustomerHandles($esiData->getLayoutHandles()));
     foreach ($esiData->getDummyBlocks() as $blockName) {
         $layout->createBlock('Mage_Core_Block_Template', $blockName);
     }
     if (!$this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) {
         Mage::dispatchEvent('controller_action_layout_generate_xml_before', array('action' => $this, 'layout' => $layout));
     }
     $layout->generateXml();
     /** @var Nexcessnet_Turpentine_Helper_Data $turpentineHelper */
     $turpentineHelper = Mage::helper('turpentine/data')->setLayout($layout);
     $blockNode = current($layout->getNode()->xpath(sprintf('//block[@name=\'%s\']', $esiData->getNameInLayout())));
     if (!$blockNode instanceof Mage_Core_Model_Layout_Element) {
         Mage::helper('turpentine/debug')->logWarn('No block node found with @name="%s"', $esiData->getNameInLayout());
         return null;
     }
     $nodesToGenerate = $turpentineHelper->getChildBlockNames($blockNode);
     Mage::getModel('turpentine/shim_mage_core_layout')->shim_generateFullBlock($blockNode);
     //find addional blocks that aren't defined in the <block/> but via <reference name="%s">
     $referenceNodes = $layout->getNode()->xpath(sprintf('//reference[@name=\'%s\']', $esiData->getNameInLayout()));
     if ($referenceNodes) {
         foreach ($referenceNodes as $referenceNode) {
             if ($referenceNode instanceof Mage_Core_Model_Layout_Element) {
                 $referencesToGenerate = $turpentineHelper->getChildBlockNames($referenceNode);
                 $nodesToGenerate = array_merge($nodesToGenerate, $referencesToGenerate);
             }
         }
     }
     // dispatch event for adding xml layout elements
     if (!$this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) {
         Mage::dispatchEvent('controller_action_layout_generate_blocks_before', array('action' => $this, 'layout' => $layout));
     }
     foreach (array_unique($nodesToGenerate) as $nodeName) {
         foreach ($layout->getNode()->xpath(sprintf('//reference[@name=\'%s\']', $nodeName)) as $node) {
             $layout->generateBlocks($node);
         }
     }
     $block = $layout->getBlock($esiData->getNameInLayout());
     if (!$this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) {
         Mage::dispatchEvent('controller_action_layout_generate_blocks_after', array('action' => $this, 'layout' => $layout));
     }
     $this->_isLayoutLoaded = true;
     Varien_Profiler::stop('turpentine::controller::esi::_getEsiBlock');
     return $block;
 }
 /**
  * Generate the ESI block
  *
  * @param  Varien_Object $esiData
  * @return Mage_Core_Block_Template
  */
 protected function _getEsiBlock($esiData)
 {
     $block = null;
     Varien_Profiler::start('turpentine::controller::esi::_getEsiBlock');
     foreach ($esiData->getSimpleRegistry() as $key => $value) {
         Mage::register($key, $value, true);
     }
     foreach ($esiData->getComplexRegistry() as $key => $data) {
         $value = Mage::getModel($data['model']);
         if (!is_object($value)) {
             Mage::helper('turpentine/debug')->logWarn('Failed to register key/model: %s as %s(%s)', $key, $data['model'], $data['id']);
             continue;
         } else {
             $value->load($data['id']);
             Mage::register($key, $value, true);
         }
     }
     $layout = Mage::getSingleton('core/layout');
     Mage::getSingleton('core/design_package')->setPackageName($esiData->getDesignPackage())->setTheme($esiData->getDesignTheme());
     $layoutUpdate = $layout->getUpdate();
     $layoutUpdate->load($this->_swapCustomerHandles($esiData->getLayoutHandles()));
     foreach ($esiData->getDummyBlocks() as $blockName) {
         $layout->createBlock('Mage_Core_Block_Template', $blockName);
     }
     $layout->generateXml();
     $blockNode = current($layout->getNode()->xpath(sprintf('//block[@name=\'%s\']', $esiData->getNameInLayout())));
     if ($blockNode instanceof Varien_Simplexml_Element) {
         $nodesToGenerate = Mage::helper('turpentine/data')->setLayout($layout)->getChildBlockNames($blockNode);
         Mage::getModel('turpentine/shim_mage_core_layout')->shim_generateFullBlock($blockNode);
         foreach ($nodesToGenerate as $nodeName) {
             foreach ($layout->getNode()->xpath(sprintf('//reference[@name=\'%s\']', $nodeName)) as $node) {
                 $layout->generateBlocks($node);
             }
         }
         $block = $layout->getBlock($esiData->getNameInLayout());
     } else {
         Mage::helper('turpentine/debug')->logWarn('No block node found with @name="%s"', $esiData->getNameInLayout());
     }
     Varien_Profiler::stop('turpentine::controller::esi::_getEsiBlock');
     return $block;
 }