summaryrefslogtreecommitdiff
path: root/vendor/sebastian/object-enumerator/src/Enumerator.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/sebastian/object-enumerator/src/Enumerator.php')
-rw-r--r--vendor/sebastian/object-enumerator/src/Enumerator.php88
1 files changed, 88 insertions, 0 deletions
diff --git a/vendor/sebastian/object-enumerator/src/Enumerator.php b/vendor/sebastian/object-enumerator/src/Enumerator.php
new file mode 100644
index 000000000..de75d17c5
--- /dev/null
+++ b/vendor/sebastian/object-enumerator/src/Enumerator.php
@@ -0,0 +1,88 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of sebastian/object-enumerator.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\ObjectEnumerator;
+
+use function array_merge;
+use function func_get_args;
+use function is_array;
+use function is_object;
+use SebastianBergmann\ObjectReflector\ObjectReflector;
+use SebastianBergmann\RecursionContext\Context;
+
+/**
+ * Traverses array structures and object graphs
+ * to enumerate all referenced objects.
+ */
+class Enumerator
+{
+ /**
+ * Returns an array of all objects referenced either
+ * directly or indirectly by a variable.
+ *
+ * @param array|object $variable
+ *
+ * @return object[]
+ */
+ public function enumerate($variable)
+ {
+ if (!is_array($variable) && !is_object($variable)) {
+ throw new InvalidArgumentException;
+ }
+
+ if (isset(func_get_args()[1])) {
+ if (!func_get_args()[1] instanceof Context) {
+ throw new InvalidArgumentException;
+ }
+
+ $processed = func_get_args()[1];
+ } else {
+ $processed = new Context;
+ }
+
+ $objects = [];
+
+ if ($processed->contains($variable)) {
+ return $objects;
+ }
+
+ $array = $variable;
+ $processed->add($variable);
+
+ if (is_array($variable)) {
+ foreach ($array as $element) {
+ if (!is_array($element) && !is_object($element)) {
+ continue;
+ }
+
+ $objects = array_merge(
+ $objects,
+ $this->enumerate($element, $processed)
+ );
+ }
+ } else {
+ $objects[] = $variable;
+
+ $reflector = new ObjectReflector;
+
+ foreach ($reflector->getAttributes($variable) as $value) {
+ if (!is_array($value) && !is_object($value)) {
+ continue;
+ }
+
+ $objects = array_merge(
+ $objects,
+ $this->enumerate($value, $processed)
+ );
+ }
+ }
+
+ return $objects;
+ }
+}