Completed
Push — master ( 84ae97...9b22ab )
by Andrii
03:58
created

AbstractUnit   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Coupling/Cohesion

Components 3
Dependencies 2

Test Coverage

Coverage 85.71%

Importance

Changes 0
Metric Value
wmc 13
lcom 3
cbo 2
dl 0
loc 108
ccs 24
cts 28
cp 0.8571
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A getConverter() 0 4 1
A getName() 0 4 1
A getMeasure() 0 4 1
A getCalculator() 0 4 1
A equals() 0 4 1
A isConvertible() 0 4 1
A convert() 0 4 1
A __callStatic() 0 4 1
A create() 0 8 2
A findConverter() 0 4 1
A jsonSerialize() 0 4 1
1
<?php
2
/**
3
 * PHP Units of Measure Library
4
 *
5
 * @link      https://github.com/hiqdev/php-units
6
 * @package   php-units
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2017-2018, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hiqdev\php\units;
12
13
use JsonSerializable;
14
use hiqdev\php\units\exceptions\InvalidConfigException;
15
16
/**
17
 * Abstract Unit of measure. E.g.
18
 * Almost final.
19
 * Only findCoverter can be changed.
20
 *
21
 * @see UnitInterface
22
 * @author Andrii Vasyliev <[email protected]>
23
 */
24
abstract class AbstractUnit implements UnitInterface, JsonSerializable
25
{
26
    /**
27
     * @var string
28
     */
29
    private $name;
30
31
    /**
32
     * @var ConverterInterface
33
     */
34
    private $converter;
35
36 5
    private function __construct($name, ConverterInterface $converter)
37
    {
38 5
        $this->name = $name;
39 5
        $this->converter = $converter;
40 5
    }
41
42 11
    private function getConverter()
43
    {
44 11
        return $this->converter;
45
    }
46
47
    /**
48
     * {@inheritdoc}
49
     */
50 16
    final public function getName()
51
    {
52 16
        return $this->name;
53
    }
54
55
    /**
56
     * {@inheritdoc}
57
     */
58 10
    final public function getMeasure()
59
    {
60 10
        return $this->getConverter()->getMeasure($this);
61
    }
62
63
    /**
64
     * {@inheritdoc}
65
     */
66 4
    final public function getCalculator()
67
    {
68 4
        return $this->getConverter()->getCalculator($this);
69
    }
70
71
    /**
72
     * {@inheritdoc}
73
     */
74 2
    final public function equals(UnitInterface $other)
75
    {
76 2
        return $this->getConverter()->equals($this, $other);
77
    }
78
79
    /**
80
     * {@inheritdoc}
81
     */
82 2
    final public function isConvertible(UnitInterface $other)
83
    {
84 2
        return $this->getConverter()->isConvertible($this, $other);
85
    }
86
87
    /**
88
     * {@inheritdoc}
89
     */
90 7
    final public function convert(UnitInterface $other, $quantity)
91
    {
92 7
        return $this->getConverter()->convert($this, $other, $quantity);
93
    }
94
95
    /**
96
     * @var Unit[]
97
     */
98
    protected static $units;
99
100 17
    final public static function __callStatic($name, $args)
101
    {
102 17
        return static::create($name);
103
    }
104
105 17
    public static function create($name)
106
    {
107 17
        if (!isset(static::$units[$name])) {
108 5
            static::$units[$name] = new static($name, static::findConverter($name));
109
        }
110
111 17
        return static::$units[$name];
112
    }
113
114
    /**
115
     * Returns converter for given unit name.
116
     * The only function to change in child classes.
117
     * XXX Should be defined as abstract but not supported in PHP5.
118
     * @param string $name
119
     * @throws InvalidConfigException
120
     * @return ConverterInterface
121
     */
122
    protected static function findConverter($name)
0 ignored issues
show
Unused Code introduced by
The parameter $name is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
123
    {
124
        throw new InvalidConfigException('findConverter method must be redefined');
125
    }
126
127
    public function jsonSerialize()
128
    {
129
        return ['name' => $this->name];
130
    }
131
}
132