24 private static $strategies = [
25 Strategy\PuliBetaStrategy::class,
26 Strategy\CommonClassesStrategy::class,
27 Strategy\CommonPsr17ClassesStrategy::class,
35 private static $cache = [];
49 if (
null !== ($class = self::getFromCache($type))) {
54 foreach (self::$strategies as $strategy) {
56 $candidates = call_user_func($strategy.
'::getCandidates', $type);
63 foreach ($candidates as $candidate) {
64 if (isset($candidate[
'condition'])) {
65 if (!self::evaluateCondition($candidate[
'condition'])) {
71 self::storeInCache($type, $candidate);
73 return $candidate[
'class'];
89 private static function getFromCache($type)
91 if (!isset(self::$cache[$type])) {
95 $candidate = self::$cache[$type];
96 if (isset($candidate[
'condition'])) {
97 if (!self::evaluateCondition($candidate[
'condition'])) {
102 return $candidate[
'class'];
111 private static function storeInCache($type, $class)
113 self::$cache[$type] = $class;
123 self::$strategies = $strategies;
134 self::$strategies[] = $strategy;
145 array_unshift(self::$strategies, $strategy);
166 if (is_string($condition)) {
170 if (is_callable($condition)) {
171 return (
bool) $condition();
173 if (is_bool($condition)) {
176 if (is_array($condition)) {
177 foreach ($condition as $c) {
178 if (
false === static::evaluateCondition($c)) {
202 if (is_string($class)) {
206 if (is_callable($class)) {
231 return class_exists($class) || interface_exists($class);