Test Failed
Push — master ( 0cbd75...cf64e0 )
by Dmitry
02:49
created

Entity   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 9
eloc 20
c 1
b 0
f 0
dl 0
loc 47
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getRequiredProperties() 0 12 3
A __construct() 0 25 6
1
<?php
2
3
namespace Anticaptcha;
4
5
use InvalidArgumentException;
6
use ReflectionClass;
7
use ReflectionProperty;
8
9
abstract class Entity
10
{
11
    public function __construct(array $properties = [])
12
    {
13
        /* Validate required */
14
15
        foreach ($this->getRequiredProperties() as $property) {
16
            if (!isset($properties[$property])) {
17
                throw new InvalidArgumentException(
18
                    sprintf('Property "%s" is required.', $property)
19
                );
20
            }
21
        }
22
23
        /**
24
         * @var string $option
25
         * @var mixed $value
26
         */
27
        foreach ($properties as $option => $value) {
28
            $setter = 'set' . ucfirst($option);
29
            if (method_exists($this, $setter)) {
30
                call_user_func([$this, $setter], $value);
31
            } elseif (property_exists($this, $option)) {
32
                $this->$option = $value;
33
            } else {
34
                throw new InvalidArgumentException(
35
                    sprintf('Property "%s" not found in class "%s".', $option, static::class)
36
                );
37
            }
38
        }
39
    }
40
41
    /**
42
     * @return string[]
43
     */
44
    protected function getRequiredProperties(): array
45
    {
46
        $properties = [];
47
48
        foreach ((new ReflectionClass(static::class))->getProperties(ReflectionProperty::IS_PUBLIC) as $reflection) {
49
            if ($reflection->hasDefaultValue()) {
50
                continue;
51
            }
52
            $properties[] = $reflection->getName();
53
        }
54
55
        return $properties;
56
    }
57
}
58