|
18 | 18 | use Roave\BetterReflection\Reflection\ReflectionMethod as BetterReflectionMethod; |
19 | 19 | use Roave\BetterReflection\Reflection\ReflectionProperty as BetterReflectionProperty; |
20 | 20 | use Roave\BetterReflection\Util\FileHelper; |
| 21 | +use Roave\BetterReflection\Util\Memoize; |
21 | 22 | use ValueError; |
22 | 23 |
|
23 | 24 | use function array_combine; |
|
33 | 34 | */ |
34 | 35 | final class ReflectionEnum extends CoreReflectionEnum |
35 | 36 | { |
36 | | - /** @var list<ReflectionEnumUnitCase>|list<ReflectionEnumBackedCase>|null */ |
37 | | - private array|null $cases = null; |
| 37 | + /** @var Memoize<list<ReflectionEnumUnitCase>|list<ReflectionEnumBackedCase>> */ |
| 38 | + private Memoize $cases; |
38 | 39 |
|
39 | 40 | public function __construct(private BetterReflectionEnum $betterReflectionEnum) |
40 | 41 | { |
41 | 42 | unset($this->name); |
| 43 | + |
| 44 | + $this->cases = new Memoize(function() { |
| 45 | + $isBacked = $this->betterReflectionEnum->isBacked(); |
| 46 | + $cases = $this->betterReflectionEnum->getCases(); |
| 47 | + |
| 48 | + $mappedCases = []; |
| 49 | + foreach ($cases as $case) { |
| 50 | + if ($isBacked) { |
| 51 | + $mappedCases[] = new ReflectionEnumBackedCase($case); |
| 52 | + } else { |
| 53 | + $mappedCases[] = new ReflectionEnumUnitCase($case); |
| 54 | + } |
| 55 | + } |
| 56 | + return $mappedCases; |
| 57 | + }); |
42 | 58 | } |
43 | 59 |
|
44 | 60 | /** @return non-empty-string */ |
@@ -533,23 +549,7 @@ public function getCase(string $name): ReflectionEnumUnitCase|ReflectionEnumBack |
533 | 549 | /** @return list<ReflectionEnumUnitCase>|list<ReflectionEnumBackedCase> */ |
534 | 550 | public function getCases(): array |
535 | 551 | { |
536 | | - if ($this->cases !== null) { |
537 | | - return $this->cases; |
538 | | - } |
539 | | - |
540 | | - $isBacked = $this->betterReflectionEnum->isBacked(); |
541 | | - $cases = $this->betterReflectionEnum->getCases(); |
542 | | - |
543 | | - $mappedCases = []; |
544 | | - foreach ($cases as $case) { |
545 | | - if ($isBacked) { |
546 | | - $mappedCases[] = new ReflectionEnumBackedCase($case); |
547 | | - } else { |
548 | | - $mappedCases[] = new ReflectionEnumUnitCase($case); |
549 | | - } |
550 | | - } |
551 | | - |
552 | | - return $this->cases = $mappedCases; |
| 552 | + return $this->cases->memoize(); |
553 | 553 | } |
554 | 554 |
|
555 | 555 | public function isBacked(): bool |
|
0 commit comments