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

CallableGenerator   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 6
dl 0
loc 54
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A generateCallable() 0 19 4
A generateCallableSignature() 0 3 1
A addCallback() 0 3 1
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