Passed
Push — master ( f281f2...2c849f )
by emilien
02:04
created

CallableGenerator::addCallback()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 2
1
<?php
2
3
4
namespace Actiane\EntityChangeWatchBundle\Generator;
5
6
/**
7
 * Class CallableGenerator
8
 * @package Actiane\EntityChangeWatchBundle\Generator
9
 */
10
class CallableGenerator
11
{
12
    /**
13
     * @var array
14
     */
15
    private $callbacks = [];
16
17
    /**
18
     * Generate the arrays used for call_user_func_array
19
     *
20
     * @param array $arrayCallable
21
     * @param       $entity
22
     *
23
     * @param       $changedProperties
24
     *
25
     * @return array
26
     */
27
    public function generateCallable(array $arrayCallable = [], $entity, $changedProperties = null)
28
    {
29
        $callable = [];
30
        if (
31
            array_key_exists('name', $arrayCallable) &&
32
            array_key_exists('method', $arrayCallable) &&
33
            array_key_exists('flush', $arrayCallable)
34
        ) {
35
            $callable[$this->generateCallableSignature($arrayCallable, $entity)] = [
36
                'callable' => [
37
                    $this->callbacks[$arrayCallable['name']],
38
                    $arrayCallable['method'],
39
                ],
40
                'parameters' => ['entity' => $entity, 'changedProperties' => $changedProperties],
41
                'flush' => $arrayCallable['flush'],
42
            ];
43
        }
44
45
        return $callable;
46
    }
47
48
    /**
49
     * Generate the signature of a callback to ensure that each callback for the same entity is only called once
50
     *
51
     * @param array $arrayCallable
52
     * @param       $entity
53
     *
54
     * @return string
55
     */
56
    private function generateCallableSignature(array $arrayCallable = [], $entity)
57
    {
58
        return $arrayCallable['name'].':'.$arrayCallable['method'].':'.spl_object_hash($entity);
59
    }
60
61
    public function addCallback($key, $reference)
62
    {
63
        $this->callbacks[$key] = $reference;
64
    }
65
}
66