Completed
Push — work-fleets ( d6880d...ad253d )
by SuperNova.WS
07:04
created

Accessors::setAccessor()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 6
Bugs 0 Features 0
Metric Value
cc 3
eloc 6
c 6
b 0
f 0
nc 3
nop 3
dl 0
loc 16
ccs 0
cts 7
cp 0
crap 12
rs 9.4285
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
    } elseif (!is_callable($callable)) {
39
      throw new \Exception('Error assigning callable in ' . get_called_class() . '::setAccessor()! Callable typed [' . $accessor . '] is not a callable or not accessible in the scope');
40
    }
41
42
    // Converting method array-callable to closure
43
    // Require PHP 5.4 !!!!!!!!!!
0 ignored issues
show
Unused Code Comprehensibility introduced by
62% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
44
//    if (is_array($callable) && count($callable) == 2 && is_object($callable[0])) {
45
//      $method = new \ReflectionMethod($callable[0], $callable[1]);
46
//      $callable = $method->getClosure($callable[0]);
47
//    }
48
49
    $this->accessors[$varName][$accessor] = $callable;
50
  }
51
52
  /**
53
   * Gets accessor for later use
54
   *
55
   * @param string $varName
56
   * @param string $accessor
57
   *
58
   * @return callable|null
59
   */
60
  public function getAccessor($varName, $accessor) {
61
    return isset($this->accessors[$varName][$accessor]) ? $this->accessors[$varName][$accessor] : null;
62
  }
63
64
  /**
65
   * @param string $varName
66
   * @param string $accessor
67
   *
68
   * @return bool
69
   */
70
  public function haveAccessor($varName, $accessor) {
71
    return isset($this->accessors[$varName][$accessor]);
72
  }
73
74
  /**
75
   * @param string $varName
76
   * @param string $accessor
77
   * @param array  $params
78
   *
79
   * @return mixed
80
   * @throws \Exception
81
   */
82
  public function invokeAccessor($varName, $accessor, $params) {
83
    if (!$this->haveAccessor($varName, $accessor)) {
84
      throw new \Exception("No [{$accessor}] accessor found for variable [{$varName}] on " . get_called_class() . "::" . __METHOD__);
85
    }
86
87
    return call_user_func_array($this->getAccessor($varName, $accessor), $params);
88
  }
89
90
}
91