1 <?php
2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
29 trait rex_factory_trait
30 {
31 32 33
34 private static $factoryClasses = [];
35
36 37 38 39 40 41 42
43 public static function setFactoryClass($subclass)
44 {
45 if (!is_string($subclass)) {
46 throw new InvalidArgumentException('Expecting $subclass to be a string, ' . gettype($subclass) . ' given!');
47 }
48 $calledClass = static::class;
49 if ($subclass != $calledClass && !is_subclass_of($subclass, $calledClass)) {
50 throw new InvalidArgumentException('$class "' . $subclass . '" is expected to define a subclass of ' . $calledClass . '!');
51 }
52 self::$factoryClasses[$calledClass] = $subclass;
53 }
54
55 56 57 58 59
60 public static function getFactoryClass()
61 {
62 $calledClass = static::class;
63 return isset(self::$factoryClasses[$calledClass]) ? self::$factoryClasses[$calledClass] : $calledClass;
64 }
65
66 67 68 69 70
71 public static function hasFactoryClass()
72 {
73 $calledClass = static::class;
74 return isset(self::$factoryClasses[$calledClass]) && self::$factoryClasses[$calledClass] != $calledClass;
75 }
76
77 78 79 80 81 82 83 84
85 protected static function callFactoryClass($method, array $arguments)
86 {
87 $class = static::getFactoryClass();
88 return call_user_func_array([$class, $method], $arguments);
89 }
90 }
91