PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/zendframework/zend-di/src/DefinitionList.php

https://gitlab.com/yousafsyed/easternglamor
PHP | 352 lines | 244 code | 35 blank | 73 comment | 48 complexity | 5876630a865aae69bd6d1f2ecb672742 MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. */
  9. namespace Zend\Di;
  10. use SplDoublyLinkedList;
  11. use Zend\Di\Definition\RuntimeDefinition;
  12. /**
  13. * Class definition based on multiple definitions
  14. */
  15. class DefinitionList extends SplDoublyLinkedList implements Definition\DefinitionInterface
  16. {
  17. protected $classes = array();
  18. protected $runtimeDefinitions;
  19. /**
  20. * @param Definition\DefinitionInterface|Definition\DefinitionInterface[] $definitions
  21. */
  22. public function __construct($definitions)
  23. {
  24. $this->runtimeDefinitions = new SplDoublyLinkedList();
  25. if (!is_array($definitions)) {
  26. $definitions = array($definitions);
  27. }
  28. foreach ($definitions as $definition) {
  29. $this->addDefinition($definition, true);
  30. }
  31. }
  32. /**
  33. * Add definitions
  34. *
  35. * @param Definition\DefinitionInterface $definition
  36. * @param bool $addToBackOfList
  37. * @return void
  38. */
  39. public function addDefinition(Definition\DefinitionInterface $definition, $addToBackOfList = true)
  40. {
  41. if ($addToBackOfList) {
  42. $this->push($definition);
  43. } else {
  44. $this->unshift($definition);
  45. }
  46. }
  47. protected function getDefinitionClassMap(Definition\DefinitionInterface $definition)
  48. {
  49. $definitionClasses = $definition->getClasses();
  50. if (empty($definitionClasses)) {
  51. return array();
  52. }
  53. return array_combine(array_values($definitionClasses), array_fill(0, count($definitionClasses), $definition));
  54. }
  55. public function unshift($definition)
  56. {
  57. $result = parent::unshift($definition);
  58. if ($definition instanceof RuntimeDefinition) {
  59. $this->runtimeDefinitions->unshift($definition);
  60. }
  61. $this->classes = array_merge($this->classes, $this->getDefinitionClassMap($definition));
  62. return $result;
  63. }
  64. public function push($definition)
  65. {
  66. $result = parent::push($definition);
  67. if ($definition instanceof RuntimeDefinition) {
  68. $this->runtimeDefinitions->push($definition);
  69. }
  70. $this->classes = array_merge($this->getDefinitionClassMap($definition), $this->classes);
  71. return $result;
  72. }
  73. /**
  74. * @param string $type
  75. * @return Definition\DefinitionInterface[]
  76. */
  77. public function getDefinitionsByType($type)
  78. {
  79. $definitions = array();
  80. foreach ($this as $definition) {
  81. if ($definition instanceof $type) {
  82. $definitions[] = $definition;
  83. }
  84. }
  85. return $definitions;
  86. }
  87. /**
  88. * Get definition by type
  89. *
  90. * @param string $type
  91. * @return Definition\DefinitionInterface
  92. */
  93. public function getDefinitionByType($type)
  94. {
  95. foreach ($this as $definition) {
  96. if ($definition instanceof $type) {
  97. return $definition;
  98. }
  99. }
  100. return false;
  101. }
  102. /**
  103. * @param string $class
  104. * @return bool|Definition\DefinitionInterface
  105. */
  106. public function getDefinitionForClass($class)
  107. {
  108. if (array_key_exists($class, $this->classes)) {
  109. return $this->classes[$class];
  110. }
  111. /** @var $definition Definition\DefinitionInterface */
  112. foreach ($this->runtimeDefinitions as $definition) {
  113. if ($definition->hasClass($class)) {
  114. return $definition;
  115. }
  116. }
  117. return false;
  118. }
  119. /**
  120. * @param string $class
  121. * @return bool|Definition\DefinitionInterface
  122. */
  123. public function forClass($class)
  124. {
  125. return $this->getDefinitionForClass($class);
  126. }
  127. /**
  128. * {@inheritDoc}
  129. */
  130. public function getClasses()
  131. {
  132. return array_keys($this->classes);
  133. }
  134. /**
  135. * {@inheritDoc}
  136. */
  137. public function hasClass($class)
  138. {
  139. if (array_key_exists($class, $this->classes)) {
  140. return true;
  141. }
  142. /** @var $definition Definition\DefinitionInterface */
  143. foreach ($this->runtimeDefinitions as $definition) {
  144. if ($definition->hasClass($class)) {
  145. return true;
  146. }
  147. }
  148. return false;
  149. }
  150. /**
  151. * {@inheritDoc}
  152. */
  153. public function getClassSupertypes($class)
  154. {
  155. if (false === ($classDefinition = $this->getDefinitionForClass($class))) {
  156. return array();
  157. }
  158. $supertypes = $classDefinition->getClassSupertypes($class);
  159. if (! $classDefinition instanceof Definition\PartialMarker) {
  160. return $supertypes;
  161. }
  162. /** @var $definition Definition\DefinitionInterface */
  163. foreach ($this as $definition) {
  164. if ($definition === $classDefinition) {
  165. continue;
  166. }
  167. if ($definition->hasClass($class)) {
  168. $supertypes = array_merge($supertypes, $definition->getClassSupertypes($class));
  169. if ($definition instanceof Definition\PartialMarker) {
  170. continue;
  171. }
  172. return $supertypes;
  173. }
  174. }
  175. return $supertypes;
  176. }
  177. /**
  178. * {@inheritDoc}
  179. */
  180. public function getInstantiator($class)
  181. {
  182. if (! $classDefinition = $this->getDefinitionForClass($class)) {
  183. return false;
  184. }
  185. $value = $classDefinition->getInstantiator($class);
  186. if (!is_null($value)) {
  187. return $value;
  188. }
  189. if (! $classDefinition instanceof Definition\PartialMarker) {
  190. return false;
  191. }
  192. /** @var $definition Definition\DefinitionInterface */
  193. foreach ($this as $definition) {
  194. if ($definition === $classDefinition) {
  195. continue;
  196. }
  197. if ($definition->hasClass($class)) {
  198. $value = $definition->getInstantiator($class);
  199. if ($value === null && $definition instanceof Definition\PartialMarker) {
  200. continue;
  201. }
  202. return $value;
  203. }
  204. }
  205. return false;
  206. }
  207. /**
  208. * {@inheritDoc}
  209. */
  210. public function hasMethods($class)
  211. {
  212. if (! $classDefinition = $this->getDefinitionForClass($class)) {
  213. return false;
  214. }
  215. if (false !== ($methods = $classDefinition->hasMethods($class))) {
  216. return $methods;
  217. }
  218. if (! $classDefinition instanceof Definition\PartialMarker) {
  219. return false;
  220. }
  221. /** @var $definition Definition\DefinitionInterface */
  222. foreach ($this as $definition) {
  223. if ($definition === $classDefinition) {
  224. continue;
  225. }
  226. if ($definition->hasClass($class)) {
  227. if ($definition->hasMethods($class) === false && $definition instanceof Definition\PartialMarker) {
  228. continue;
  229. }
  230. return $definition->hasMethods($class);
  231. }
  232. }
  233. return false;
  234. }
  235. /**
  236. * {@inheritDoc}
  237. */
  238. public function hasMethod($class, $method)
  239. {
  240. if (!$this->hasMethods($class)) {
  241. return false;
  242. }
  243. $classDefinition = $this->getDefinitionForClass($class);
  244. if ($classDefinition->hasMethod($class, $method)) {
  245. return true;
  246. }
  247. /** @var $definition Definition\DefinitionInterface */
  248. foreach ($this->runtimeDefinitions as $definition) {
  249. if ($definition === $classDefinition) {
  250. continue;
  251. }
  252. if ($definition->hasClass($class) && $definition->hasMethod($class, $method)) {
  253. return true;
  254. }
  255. }
  256. return false;
  257. }
  258. /**
  259. * {@inheritDoc}
  260. */
  261. public function getMethods($class)
  262. {
  263. if (false === ($classDefinition = $this->getDefinitionForClass($class))) {
  264. return array();
  265. }
  266. $methods = $classDefinition->getMethods($class);
  267. if (! $classDefinition instanceof Definition\PartialMarker) {
  268. return $methods;
  269. }
  270. /** @var $definition Definition\DefinitionInterface */
  271. foreach ($this as $definition) {
  272. if ($definition === $classDefinition) {
  273. continue;
  274. }
  275. if ($definition->hasClass($class)) {
  276. if (!$definition instanceof Definition\PartialMarker) {
  277. return array_merge($definition->getMethods($class), $methods);
  278. }
  279. $methods = array_merge($definition->getMethods($class), $methods);
  280. }
  281. }
  282. return $methods;
  283. }
  284. /**
  285. * {@inheritDoc}
  286. */
  287. public function hasMethodParameters($class, $method)
  288. {
  289. $methodParameters = $this->getMethodParameters($class, $method);
  290. return ($methodParameters !== array());
  291. }
  292. /**
  293. * {@inheritDoc}
  294. */
  295. public function getMethodParameters($class, $method)
  296. {
  297. if (false === ($classDefinition = $this->getDefinitionForClass($class))) {
  298. return array();
  299. }
  300. if ($classDefinition->hasMethod($class, $method) && $classDefinition->hasMethodParameters($class, $method)) {
  301. return $classDefinition->getMethodParameters($class, $method);
  302. }
  303. /** @var $definition Definition\DefinitionInterface */
  304. foreach ($this as $definition) {
  305. if ($definition === $classDefinition) {
  306. continue;
  307. }
  308. if ($definition->hasClass($class)
  309. && $definition->hasMethod($class, $method)
  310. && $definition->hasMethodParameters($class, $method)
  311. ) {
  312. return $definition->getMethodParameters($class, $method);
  313. }
  314. }
  315. return array();
  316. }
  317. }