Completed
Push — work-fleets ( cf53fe...8d34ed )
by SuperNova.WS
06:54
created

Accessors::getAccessor()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 2
eloc 2
nc 2
nop 2
dl 0
loc 3
rs 10
c 3
b 0
f 0
ccs 0
cts 2
cp 0
crap 6
1
<?php
2
/**
3
 * Created by Gorlum 19.08.2016 20:35
4
 */
5
6
namespace Common;
7
8
/**
9
 * Accessors storage
10
 *
11
 * TODO - make magic method access to accessors ????????
12
 *
13
 * @package Common
14
 */
15
class Accessors {
16
17
  /**
18
   * Array of accessors - getters/setters/etc
19
   *
20
   * @var callable[][]
21
   */
22
  protected $accessors = array();
23
24
  /**
25
   * Assign accessor to a named variable
26
   *
27
   * Different accessors have different signatures - you should look carefully before assigning accessor
28
   *
29
   * @param string   $varName
30
   * @param string   $accessor - type of accessor getter/setter/importer/exporter/etc
31
   * @param callable $callable
32
   *
33
   * @throws \Exception
34
   */
35
  public function setAccessor($varName, $accessor, $callable) {
36
    if (empty($callable)) {
37
      return;
38
    }
39
40
    if (is_callable($callable)) {
41
      // Converting method array-callable to closure
42
      if(is_array($callable) && count($callable) == 2 && is_object($callable[0])) {
43
        $method = new \ReflectionMethod($callable[0], $callable[1]);
44
        $callable = $method->getClosure($callable[0]);
45
      }
46
47
      $this->accessors[$varName][$accessor] = $callable;
48
    } else {
49
      throw new \Exception('Error assigning callable in ' . get_called_class() . '::setAccessor()! Callable typed [' . $accessor . '] is not a callable or not accessible in the scope');
50
    }
51
  }
52
53
  /**
54
   * Gets accessor for later use
55
   *
56
   * @param string $varName
57
   * @param string $accessor
58
   *
59
   * @return callable|null
60
   */
61
  public function getAccessor($varName, $accessor) {
62
    return isset($this->accessors[$varName][$accessor]) ? $this->accessors[$varName][$accessor] : null;
63
  }
64
65
  /**
66
   * @param string $varName
67
   * @param string $accessor
68
   *
69
   * @return bool
70
   */
71
  public function haveAccessor($varName, $accessor) {
72
    return isset($this->accessors[$varName][$accessor]);
73
  }
74
75
  /**
76
   * @param string $varName
77
   * @param string $accessor
78
   * @param array  $params
79
   *
80
   * @return mixed
81
   * @throws \Exception
82
   */
83
  public function invokeAccessor($varName, $accessor, $params) {
84
    if (!$this->haveAccessor($varName, $accessor)) {
85
      throw new \Exception("No [{$accessor}] accessor found for variable [{$varName}] on " . get_called_class() . "::" . __METHOD__);
86
    }
87
88
    return call_user_func_array($this->getAccessor($varName, $accessor), $params);
89
  }
90
91
}
92