Completed
Push — master ( 70c410...bb9e46 )
by Théo
8s
created

ServiceBuilder::build()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 1
eloc 9
nc 1
nop 2
1
<?php
2
3
/**
4
 * This file is part of the LaravelYaml package.
5
 *
6
 * (c) Théo FIDRY <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Fidry\LaravelYaml\DependencyInjection\Builder;
13
14
use Fidry\LaravelYaml\DependencyInjection\Builder\Instantiator\ServiceInstantiator;
15
use Fidry\LaravelYaml\DependencyInjection\Definition\ServiceInterface;
16
use Illuminate\Contracts\Foundation\Application;
17
18
/**
19
 * @author Théo FIDRY <[email protected]>
20
 */
21
final class ServiceBuilder
22
{
23
    /**
24
     * @var ServiceInstantiator
25
     */
26
    private $instantiator;
27
28
    /**
29
     * @param ServiceInstantiator        $instantiator
30
     */
31
    public function __construct(ServiceInstantiator $instantiator)
32
    {
33
        $this->instantiator = $instantiator;
34
    }
35
36
    /**
37
     * @param ServiceInterface $service
38
     * @param Application      $application
39
     */
40
    public function build(ServiceInterface $service, Application $application)
41
    {
42
        $instantiator = $this->instantiator;
43
        $application->singleton(
44
            $service->getName(),
45
            function () use ($instantiator, $service) {
46
                return $instantiator->create($service);
47
            }
48
        );
49
        $application->bind($service->getClass(), $service->getName());
50
        $this->bindAutowiringTypes($service, $application);
51
        $this->tagService($service, $application);
52
    }
53
54
    private function bindAutowiringTypes(ServiceInterface $service, Application $application)
55
    {
56
        foreach ($service->getAutowiringTypes() as $binding) {
57
            $application->bind($binding, $service->getName());
58
        }
59
    }
60
61
    private function tagService(ServiceInterface $service, Application $application)
62
    {
63
        if (count($service->getTags()) !== 0) {
64
            $application->tag($service->getName(), array_keys($service->getTags()));
65
        }
66
    }
67
}
68