/**
*
* @param SourceAdapter $adapter
* @param string $source
* @return string
*/
public function compile(SourceAdapter $adapter, $source)
{
$this->initExtensions();
$sourceEvent = new SourceEvent($this, $source);
$this->dispatcher->dispatch('compiler.pre_load', $sourceEvent);
$template = $adapter->load($sourceEvent->getTemplate());
$templateEvent = new TemplateEvent($this, $template);
$this->dispatcher->dispatch('compiler.post_load', $templateEvent);
$compiler = new Compiler($this, isset($this->options['lexer']) ? $this->options['lexer'] : array());
$compiler->compile($templateEvent->getTemplate()->getDocument());
$templateEvent = new TemplateEvent($this, $templateEvent->getTemplate());
$this->dispatcher->dispatch('compiler.pre_dump', $templateEvent);
$source = $adapter->dump($templateEvent->getTemplate());
$sourceEvent = new SourceEvent($this, $source);
$this->dispatcher->dispatch('compiler.post_dump', $sourceEvent);
return $sourceEvent->getTemplate();
}