Completed
Push — master ( bf8da1...e4b361 )
by Zoltán
02:31
created

AbstractExtensionReceiver::loadExtension()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 15
ccs 9
cts 9
cp 1
rs 9.4285
cc 3
eloc 9
nc 3
nop 1
crap 3
1
<?php namespace BuildR\Utils\Extension;
2
3
use BuildR\Foundation\Exception\InvalidArgumentException;
4
5
/**
6
 * This object represents a string in OO format and allow nifty manipulation
7
 * and analysis of the provided string.
8
 *
9
 * BuildR PHP Framework
10
 *
11
 * @author Zoltán Borsos <[email protected]>
12
 * @package Utils
13
 * @subpackage Extension
14
 *
15
 * @copyright    Copyright 2016, Zoltán Borsos.
16
 * @license      https://github.com/BuildrPHP/Utils/blob/master/LICENSE.md
17
 * @link         https://github.com/BuildrPHP/Utils
18
 */
19
abstract class AbstractExtensionReceiver implements ExtensionReceiverInterface {
20
21
    /**
22
     * @type \BuildR\Utils\Extension\ObjectExtensionInterface[]
23
     */
24
    protected $extensions = [];
25
26
    /**
27
     * {@inheritdoc}
28
     */
29 2
    public function __call($name, $arguments) {
30 2
        foreach($this->extensions as $extension) {
31 2
            if($extension->hasMethod($name)) {
32 2
                $result = $extension->runMethod($name, $this->getCurrentValue(), $arguments);
33 2
                return $this->processResult($result);
34
            }
35
        }
36
    } //@codeCoverageIgnore
37
38
    /**
39
     * {@inheritDoc}
40
     */
41 4
    public function loadExtension(ObjectExtensionInterface $extension) {
42 4
        if($this->isExtensionLoaded($extension)) {
43
            return; //@codeCoverageIgnore
44
        }
45
46 4
        $type = $this->shouldReceiveType();
47 4
        $extClass = get_class($extension);
48
49 4
        if(!($extension instanceof $type)) {
50 1
            $message = 'This object only take ' . $type . ' extensions! Given: ' . $extClass;
51 1
            throw new InvalidArgumentException($message);
52
        }
53
54 3
        $this->extensions[$extClass] = $extension;
55 3
    }
56
57
    /**
58
     * {@inheritDoc}
59
     */
60 4
    public function isExtensionLoaded(ObjectExtensionInterface $extension) {
61 4
        return array_key_exists(get_class($extension), $this->extensions);
62
    }
63
64
    /**
65
     * {@inheritDoc}
66
     */
67 1
    public function getAllLoadedExtension() {
68 1
        return array_keys($this->extensions);
69
    }
70
71
}
72