Skip to content

Commit

Permalink
Fix array-copy problems on container clone
Browse files Browse the repository at this point in the history
  • Loading branch information
brendt committed May 7, 2024
1 parent 8b0f89f commit 7654f66
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 23 deletions.
41 changes: 19 additions & 22 deletions src/Container/GenericContainer.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Tempest\Container;

use Closure;
use ArrayIterator;
use ReflectionClass;
use ReflectionFunction;
use ReflectionIntersectionType;
Expand All @@ -22,32 +22,31 @@ final class GenericContainer implements Container
use HasInstance;

public function __construct(
private array $definitions = [],
private array $singletons = [],

/**
* @template T of \Tempest\Container\Initializer
* @var class-string<T> $initializers
*/
private array $initializers = [],

/**
* @template T of \Tempest\Container\DynamicInitializer
* @var class-string<T> $dynamicInitializers
*/
private array $dynamicInitializers = [],
/** @var ArrayIterator<array-key, mixed> $definitions */
private ArrayIterator $definitions = new ArrayIterator(),

/** @var ArrayIterator<array-key, mixed> $singletons */
private ArrayIterator $singletons = new ArrayIterator(),

/** @var ArrayIterator<array-key, class-string> $initializers */
private ArrayIterator $initializers = new ArrayIterator(),

/** @var ArrayIterator<array-key, class-string> $dynamicInitializers */
private ArrayIterator $dynamicInitializers = new ArrayIterator(),
private ?DependencyChain $chain = null,
) {
}

public function setInitializers(array $initializers): void
public function setInitializers(array $initializers): self
{
$this->initializers = $initializers;
$this->initializers = new ArrayIterator($initializers);

return $this;
}

public function getInitializers(): array
{
return $this->initializers;
return $this->initializers->getArrayCopy();
}

public function register(string $className, callable $definition): self
Expand Down Expand Up @@ -132,7 +131,7 @@ private function resolve(string $className, mixed ...$params): object
{
// Check if the class has been registered as a singleton.
if ($instance = $this->singletons[$className] ?? null) {
if ($instance instanceof Closure) {
if (is_callable($instance)) {
$instance = $instance($this);
$this->singletons[$className] = $instance;
}
Expand Down Expand Up @@ -160,9 +159,7 @@ private function resolve(string $className, mixed ...$params): object

// Check whether the initializer's result should be registered as a singleton
if (Attributes::find(Singleton::class)->in($initializer::class)->first() !== null) {
$this->singleton($className, fn () => $object);

return $this->get($className);
$this->singleton($className, $object);
}

return $object;
Expand Down
2 changes: 1 addition & 1 deletion tests/Unit/Container/ContainerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public function test_get_with_definition()

public function test_get_with_initializer()
{
$container = new GenericContainer(initializers: [
$container = (new GenericContainer())->setInitializers([
ContainerObjectD::class => ContainerObjectDInitializer::class,
]);

Expand Down

0 comments on commit 7654f66

Please sign in to comment.