PHPixie/Template

View on GitHub
src/PHPixie/Template/Extensions.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace PHPixie\Template;

class Extensions
{
    protected $configData;
    protected $externalExtensions;
    
    protected $extensions;
    protected $methods;
    protected $aliases;
    
    protected $extensionNames = array('html', 'format');
    protected $classMap = array(
        'html' => '\PHPixie\Template\Extensions\Extension\HTML',
        'format' => '\PHPixie\Template\Extensions\Extension\Format'
    );
    
    public function __construct($configData, $externalExtensions)
    {
        $this->configData = $configData;
        $this->externalExtensions = $externalExtensions;
    }

    public function get($name)
    {
        $this->requireMappedExtensions();
        return $this->extensions[$name];
    }
    
    /**
     * 
     * @param string $name
     * @return type
     */
    public function getMethod($name)
    {
        $this->requireMappedExtensions();
         return $this->methods[$name];
    }
    
    public function aliases()
    {
        $this->requireMappedExtensions();
        return $this->aliases;
    }
    
    protected function requireMappedExtensions()
    {
        if($this->extensions === null) {
            $this->mapExtensions();
        }
    }
    
    protected function mapExtensions()
    {
        $extensions = array();
        
        foreach($this->extensionNames as $name) {
            $extension = $this->buildExtension($name);
            $extensions[$extension->name()] = $extension;
        }
        
        foreach($this->externalExtensions as $extension) {
            $extensions[$extension->name()] = $extension;
        }
        
        $methods = array();
        $aliases = array();
        foreach($extensions as $name => $extension) {
            
            foreach($extension->methods() as $methodAlias => $method) {
                $methods[$methodAlias] = array($extension, $method);
            }
            
            foreach($extension->aliases() as $alias => $method) {
                $aliases[$alias] = array($extension, $method);
            }
        }
        
        $configAliases = $this->configData->get('aliases', array());
        
        foreach($configAliases as $alias => $config) {
            $aliases[$alias] = array(
                $extensions[$config['extension']],
                $config['method']
            );
        }
        
        $this->extensions = $extensions;
        $this->methods    = $methods;
        $this->aliases    = $aliases;
    }
    
    protected function buildExtension($name)
    {
        $class = $this->classMap[$name];
        return new $class();
    }
}