AbstractBlock   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 126
Duplicated Lines 0 %

Coupling/Cohesion

Dependencies 7

Importance

Changes 0
Metric Value
wmc 10
cbo 7
dl 0
loc 126
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A load() 0 13 2
A getConfigurationClass() 0 4 1
assemble() 0 1 ?
A getCompilerPasses() 0 4 1
A getAlias() 0 12 2
A addTask() 0 6 1
A addService() 0 4 1
A addDecoratedTask() 0 8 1
A setParameter() 0 4 1
1
<?php
2
3
/**
4
 * This file is part of Bldr.io
5
 *
6
 * (c) Aaron Scherer <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE
10
 */
11
12
namespace Bldr\DependencyInjection;
13
14
use Symfony\Component\Config\Definition\Processor;
15
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16
use Symfony\Component\DependencyInjection\Container;
17
use Symfony\Component\DependencyInjection\ContainerBuilder as SymfonyContainerBuilder;
18
use Symfony\Component\DependencyInjection\Definition;
19
use Symfony\Component\DependencyInjection\DefinitionDecorator;
20
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
21
use Symfony\Component\DependencyInjection\Extension\Extension;
22
23
/**
24
 * @author Aaron Scherer <[email protected]>
25
 */
26
abstract class AbstractBlock extends Extension implements BlockInterface
27
{
28
    /**
29
     * @var array $config
30
     */
31
    protected $config = [];
32
33
    /**
34
     * @var SymfonyContainerBuilder $container
35
     */
36
    protected $container;
37
38
    /**
39
     * @var array $originalConfiguration
40
     */
41
    protected $originalConfiguration;
42
43
    /**
44
     * {@inheritDoc}
45
     */
46
    final public function load(array $config, SymfonyContainerBuilder $container)
47
    {
48
        $this->originalConfiguration = $config;
49
50
        $configClass = $this->getConfigurationClass();
51
        if ($configClass !== false) {
52
            $this->config = (new Processor())->processConfiguration(new $configClass(), $config);
53
        }
54
55
        $this->container = $container;
56
57
        $this->assemble($this->config, $this->container);
58
    }
59
60
    /**
61
     * @return string|bool
62
     */
63
    protected function getConfigurationClass()
64
    {
65
        return false;
66
    }
67
68
    /**
69
     * @param array                   $config
70
     * @param SymfonyContainerBuilder $container
71
     *
72
     * @return mixed
73
     */
74
    abstract protected function assemble(array $config, SymfonyContainerBuilder $container);
75
76
    /**
77
     * @return CompilerPassInterface[]
78
     */
79
    public function getCompilerPasses()
80
    {
81
        return [];
82
    }
83
84
    /**
85
     * {@inheritDoc}
86
     */
87
    public function getAlias()
88
    {
89
        $className = get_class($this);
90
        if (substr($className, -5) != 'Block') {
91
            throw new BadMethodCallException(
92
                'This extension does not follow the naming convention; you must overwrite the getAlias() method.'
93
            );
94
        }
95
        $classBaseName = substr(strrchr($className, '\\'), 1, -5);
96
97
        return Container::underscore($classBaseName);
98
    }
99
100
    /**
101
     * @param string $name
102
     * @param string $class
103
     * @param array  $arguments
104
     *
105
     * @return Definition
106
     */
107
    protected function addTask($name, $class, array $arguments = [])
108
    {
109
        return $this->addService($name, $class, $arguments)
110
            ->addTag('bldr')
111
        ;
112
    }
113
114
    /**
115
     * @param string $name
116
     * @param string $class
117
     * @param array  $arguments
118
     *
119
     * @return Definition
120
     */
121
    protected function addService($name, $class, array $arguments = [])
122
    {
123
        return $this->container->setDefinition($name, new Definition($class, $arguments));
124
    }
125
126
    /**
127
     * @param $name
128
     * @param $class
129
     * @param $parentName
130
     * @param array $arguments
131
     *
132
     * @return Definition
133
     */
134
    protected function addDecoratedTask($name, $class, $parentName, array $arguments = [])
135
    {
136
        return $this->container->setDefinition($name, new DefinitionDecorator($parentName))
137
            ->setClass($class)
138
            ->setArguments($arguments)
139
            ->addTag('bldr')
140
        ;
141
    }
142
143
    /**
144
     * @param string $name
145
     * @param mixed  $value
146
     */
147
    protected function setParameter($name, $value)
148
    {
149
        $this->container->setParameter($name, $value);
150
    }
151
}
152