Completed
Push — master ( f11392...85f8c7 )
by Pavel
01:55 queued 18s
created

Chain::verifyChainMember()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 3
nc 1
nop 1
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 3
rs 9.4285
c 0
b 0
f 0
1
<?php namespace Pz\Doctrine\Rest\BuilderChain;
2
3
use Pz\Doctrine\Rest\BuilderChain\Exceptions\InvalidChainMember;
4
use Pz\Doctrine\Rest\BuilderChain\Exceptions\InvalidChainMemberResponse;
5
6
class Chain
7
{
8
    /**
9
     * @var array
10
     */
11
    protected $members = [];
12
13
    /**
14
     * Provide class or interface for verification member return.
15
     *
16
     * @return string|bool
17
     */
18 1
    public function buildClass()
19
    {
20 1
        return false;
21
    }
22
23
    /**
24
     * @param array $members
25
     *
26
     * @return static
27
     */
28 8
    public static function create(array $members = [])
29
    {
30 8
        return new static($members);
31
    }
32
33
    /**
34
     * QueryBuilderChain constructor.
35
     *
36
     * @param array|MemberInterface $members
37
     */
38 10
    public function __construct(array $members = [])
39
    {
40 10
        $this->add($members);
41 9
    }
42
43
    /**
44
     * @param array|MemberInterface|callable $member
45
     *
46
     * @return $this
47
     * @throws InvalidChainMember
48
     */
49 11
    public function add($member)
50
    {
51 11
        if (is_array($member)) {
52 10
            foreach ($member as $item) {
53 9
                $this->add($item);
54
            }
55
56 9
            return $this;
57
        }
58
59 10
        if (!is_callable($member)) {
60 1
            throw new InvalidChainMember();
61
        }
62
63 9
        $this->members[] = $member;
64
65 9
        return $this;
66
    }
67
68
    /**
69
     * @param object $object
70
     *
71
     * @return object
72
     *
73
     * @throws InvalidChainMember
74
     * @throws InvalidChainMemberResponse
75
     */
76 10
    public function process($object)
77
    {
78
        /** @var callable|MemberInterface $member */
79 10
        foreach ($this->members as $member) {
80 10
            if (!is_callable($member)) {
81 1
                throw new InvalidChainMember();
82
            }
83
84 9
            $qb = call_user_func($member, $object);
85
86 9
            if (($class = $this->buildClass()) && !($qb instanceof $class)) {
87 9
                throw new InvalidChainMemberResponse($class);
88
            }
89
        }
90
91 8
        return $object;
92
    }
93
}
94