Skip to content

Commit 65168cb

Browse files
committed
Refactor ClassContext to accept class-string directly.
Simplified ClassContext instantiation by allowing class-string input in addition to ReflectionClass. Updated relevant tests and methods to use the class-string approach, removing unnecessary ReflectionClass instances. This enhances readability and reduces boilerplate code.
1 parent cbe6ae1 commit 65168cb

File tree

6 files changed

+64
-54
lines changed

6 files changed

+64
-54
lines changed

clover.xml

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<coverage generated="1735690386">
3-
<project timestamp="1735690386">
2+
<coverage generated="1735691266">
3+
<project timestamp="1735691266">
44
<package name="Nuxtifyts\PhpDto\Attributes\Class">
55
<file name="/Users/faroukbraik/Dev/php-dto/src/Attributes/Class/WithNormalizer.php">
66
<class name="Nuxtifyts\PhpDto\Attributes\Class\WithNormalizer" namespace="Nuxtifyts\PhpDto\Attributes\Class">
@@ -348,7 +348,7 @@
348348
<package name="Nuxtifyts\PhpDto\Contexts">
349349
<file name="/Users/faroukbraik/Dev/php-dto/src/Contexts/ClassContext.php">
350350
<class name="Nuxtifyts\PhpDto\Contexts\ClassContext" namespace="Nuxtifyts\PhpDto\Contexts">
351-
<metrics complexity="12" methods="8" coveredmethods="8" conditionals="0" coveredconditionals="0" statements="27" coveredstatements="27" elements="35" coveredelements="35"/>
351+
<metrics complexity="15" methods="8" coveredmethods="8" conditionals="0" coveredconditionals="0" statements="32" coveredstatements="32" elements="40" coveredelements="40"/>
352352
</class>
353353
<line num="44" type="method" name="__construct" visibility="private" complexity="1" crap="1" count="10"/>
354354
<line num="47" type="stmt" count="10"/>
@@ -357,35 +357,40 @@
357357
<line num="50" type="stmt" count="10"/>
358358
<line num="51" type="stmt" count="10"/>
359359
<line num="52" type="stmt" count="10"/>
360-
<line num="69" type="method" name="getInstance" visibility="public" complexity="1" crap="1" count="22"/>
361-
<line num="71" type="stmt" count="22"/>
360+
<line num="70" type="method" name="getInstance" visibility="public" complexity="3" crap="3" count="22"/>
362361
<line num="72" type="stmt" count="22"/>
363-
<line num="78" type="method" name="getKey" visibility="private" complexity="1" crap="1" count="22"/>
364-
<line num="80" type="stmt" count="22"/>
365-
<line num="90" type="method" name="getPropertyContexts" visibility="private" complexity="2" crap="2" count="10"/>
366-
<line num="92" type="stmt" count="10"/>
367-
<line num="94" type="stmt" count="10"/>
368-
<line num="95" type="stmt" count="9"/>
369-
<line num="98" type="stmt" count="10"/>
370-
<line num="101" type="method" name="syncClassAttributes" visibility="private" complexity="2" crap="2" count="10"/>
362+
<line num="74" type="stmt" count="22"/>
363+
<line num="75" type="stmt" count="16"/>
364+
<line num="78" type="stmt" count="10"/>
365+
<line num="79" type="stmt" count="10"/>
366+
<line num="82" type="stmt" count="10"/>
367+
<line num="83" type="stmt" count="10"/>
368+
<line num="89" type="method" name="getKey" visibility="private" complexity="2" crap="2" count="22"/>
369+
<line num="91" type="stmt" count="22"/>
370+
<line num="101" type="method" name="getPropertyContexts" visibility="private" complexity="2" crap="2" count="10"/>
371371
<line num="103" type="stmt" count="10"/>
372-
<line num="105" type="stmt" count="1"/>
373-
<line num="106" type="stmt" count="1"/>
374-
<line num="107" type="stmt" count="1"/>
375-
<line num="108" type="stmt" count="1"/>
376-
<line num="117" type="method" name="newInstanceWithoutConstructor" visibility="public" complexity="1" crap="1" count="5"/>
377-
<line num="119" type="stmt" count="5"/>
378-
<line num="127" type="method" name="newInstanceWithConstructorCall" visibility="public" complexity="1" crap="1" count="14"/>
379-
<line num="129" type="stmt" count="14"/>
380-
<line num="139" type="method" name="emptyValue" visibility="public" complexity="3" crap="3" count="10"/>
381-
<line num="142" type="stmt" count="10"/>
382-
<line num="144" type="stmt" count="10"/>
383-
<line num="145" type="stmt" count="10"/>
384-
<line num="147" type="stmt" count="10"/>
385-
<line num="148" type="stmt" count="1"/>
386-
<line num="151" type="stmt" count="9"/>
387-
<line num="154" type="stmt" count="9"/>
388-
<metrics loc="157" ncloc="104" classes="1" methods="8" coveredmethods="8" conditionals="0" coveredconditionals="0" statements="27" coveredstatements="27" elements="35" coveredelements="35"/>
372+
<line num="105" type="stmt" count="10"/>
373+
<line num="106" type="stmt" count="9"/>
374+
<line num="109" type="stmt" count="10"/>
375+
<line num="112" type="method" name="syncClassAttributes" visibility="private" complexity="2" crap="2" count="10"/>
376+
<line num="114" type="stmt" count="10"/>
377+
<line num="116" type="stmt" count="1"/>
378+
<line num="117" type="stmt" count="1"/>
379+
<line num="118" type="stmt" count="1"/>
380+
<line num="119" type="stmt" count="1"/>
381+
<line num="128" type="method" name="newInstanceWithoutConstructor" visibility="public" complexity="1" crap="1" count="5"/>
382+
<line num="130" type="stmt" count="5"/>
383+
<line num="138" type="method" name="newInstanceWithConstructorCall" visibility="public" complexity="1" crap="1" count="14"/>
384+
<line num="140" type="stmt" count="14"/>
385+
<line num="150" type="method" name="emptyValue" visibility="public" complexity="3" crap="3" count="10"/>
386+
<line num="153" type="stmt" count="10"/>
387+
<line num="155" type="stmt" count="10"/>
388+
<line num="156" type="stmt" count="10"/>
389+
<line num="158" type="stmt" count="10"/>
390+
<line num="159" type="stmt" count="1"/>
391+
<line num="162" type="stmt" count="9"/>
392+
<line num="165" type="stmt" count="9"/>
393+
<metrics loc="168" ncloc="114" classes="1" methods="8" coveredmethods="8" conditionals="0" coveredconditionals="0" statements="32" coveredstatements="32" elements="40" coveredelements="40"/>
389394
</file>
390395
<file name="/Users/faroukbraik/Dev/php-dto/src/Contexts/PropertyContext.php">
391396
<class name="Nuxtifyts\PhpDto\Contexts\PropertyContext" namespace="Nuxtifyts\PhpDto\Contexts">
@@ -1550,6 +1555,6 @@
15501555
<metrics loc="47" ncloc="30" classes="1" methods="3" coveredmethods="3" conditionals="0" coveredconditionals="0" statements="6" coveredstatements="6" elements="9" coveredelements="9"/>
15511556
</file>
15521557
</package>
1553-
<metrics files="68" loc="3734" ncloc="3144" classes="56" methods="149" coveredmethods="119" conditionals="0" coveredconditionals="0" statements="980" coveredstatements="895" elements="1129" coveredelements="1014"/>
1558+
<metrics files="68" loc="3745" ncloc="3154" classes="56" methods="149" coveredmethods="119" conditionals="0" coveredconditionals="0" statements="985" coveredstatements="900" elements="1134" coveredelements="1019"/>
15541559
</project>
15551560
</coverage>

src/Concerns/BaseData.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ final public static function create(mixed ...$args): static
2323
{
2424
try {
2525
/** @var ClassContext<static> $context */
26-
$context = ClassContext::getInstance(new ReflectionClass(static::class));
26+
$context = ClassContext::getInstance(static::class);
2727

2828
$value = static::normalizeValue($args, static::class, $context->normalizers)
2929
?: static::normalizeValue($args[0] ?? [], static::class, $context->normalizers);
@@ -52,7 +52,7 @@ final public static function from(mixed $value): static
5252
{
5353
try {
5454
/** @var ClassContext<static> $context */
55-
$context = ClassContext::getInstance(new ReflectionClass(static::class));
55+
$context = ClassContext::getInstance(static::class);
5656

5757
$value = static::normalizeValue($value, static::class, $context->normalizers);
5858

@@ -126,7 +126,7 @@ protected static function instanceWithConstructorCallFrom(ClassContext $context,
126126
final public function jsonSerialize(): array
127127
{
128128
try {
129-
$context = ClassContext::getInstance(new ReflectionClass($this));
129+
$context = ClassContext::getInstance($this::class);
130130

131131
$serializedData = [];
132132
foreach ($context->properties as $propertyContext) {

src/Concerns/CloneableData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function with(mixed ...$args): static
2323
}
2424

2525
/** @var ClassContext<static> $context */
26-
$context = ClassContext::getInstance(new ReflectionClass(static::class));
26+
$context = ClassContext::getInstance(static::class);
2727

2828
$value = static::normalizeValue($args, static::class, $context->normalizers)
2929
?: static::normalizeValue($args[0], static::class, $context->normalizers);

src/Concerns/EmptyData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static function empty(): static
1616
{
1717
try {
1818
/** @var ClassContext<static> $classContext */
19-
$classContext = ClassContext::getInstance(new ReflectionClass(static::class));
19+
$classContext = ClassContext::getInstance(static::class);
2020

2121
return $classContext->emptyValue();
2222
} catch (Throwable $t) {

src/Contexts/ClassContext.php

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,33 @@ final private function __construct(
6262
}
6363

6464
/**
65-
* @param ReflectionClass<T> $reflectionClass
65+
* @param ReflectionClass<T>|class-string<T> $reflectionClass
6666
*
6767
* @throws UnsupportedTypeException
68+
* @throws ReflectionException
6869
*/
69-
final public static function getInstance(ReflectionClass $reflectionClass): static
70+
final public static function getInstance(string|ReflectionClass $reflectionClass): static
7071
{
72+
$instance = self::$_instances[self::getKey($reflectionClass)] ?? null;
73+
74+
if ($instance) {
75+
return $instance;
76+
}
77+
78+
if (is_string($reflectionClass)) {
79+
$reflectionClass = new ReflectionClass($reflectionClass);
80+
}
81+
7182
return self::$_instances[self::getKey($reflectionClass)]
72-
??= new static($reflectionClass);
83+
= new static($reflectionClass);
7384
}
7485

7586
/**
76-
* @param ReflectionClass<T> $reflectionClass
87+
* @param ReflectionClass<T>|class-string<T> $reflectionClass
7788
*/
78-
private static function getKey(ReflectionClass $reflectionClass): string
89+
private static function getKey(string|ReflectionClass $reflectionClass): string
7990
{
80-
return $reflectionClass->getName();
91+
return is_string($reflectionClass) ? $reflectionClass : $reflectionClass->getName();
8192
}
8293

8394
/**

tests/Unit/Contexts/ClassContextTest.php

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use PHPUnit\Framework\Attributes\CoversClass;
1212
use Nuxtifyts\PhpDto\Contexts\ClassContext;
1313
use PHPUnit\Framework\Attributes\UsesClass;
14-
use ReflectionClass;
1514
use Throwable;
1615
use Nuxtifyts\PhpDto\Tests\Unit\UnitCase;
1716

@@ -29,8 +28,7 @@ final class ClassContextTest extends UnitCase
2928
#[Test]
3029
public function can_create_an_instance_from_reflection_class(): void
3130
{
32-
$reflectionClass = new ReflectionClass(PersonData::class);
33-
$classContext = ClassContext::getInstance($reflectionClass);
31+
$classContext = ClassContext::getInstance(PersonData::class);
3432

3533
self::assertInstanceOf(ClassContext::class, $classContext);
3634
}
@@ -41,9 +39,8 @@ public function can_create_an_instance_from_reflection_class(): void
4139
#[Test]
4240
public function can_retrieve_same_instance_of_class(): void
4341
{
44-
$reflectionClass = new ReflectionClass(PersonData::class);
45-
$classContext = ClassContext::getInstance($reflectionClass);
46-
$classContext2 = ClassContext::getInstance($reflectionClass);
42+
$classContext = ClassContext::getInstance(PersonData::class);
43+
$classContext2 = ClassContext::getInstance(PersonData::class);
4744

4845
self::assertSame($classContext, $classContext2);
4946
}
@@ -54,8 +51,7 @@ public function can_retrieve_same_instance_of_class(): void
5451
#[Test]
5552
public function can_create_an_instance_from_the_reflection_class(): void
5653
{
57-
$reflectionClass = new ReflectionClass(PersonData::class);
58-
$classContext = ClassContext::getInstance($reflectionClass);
54+
$classContext = ClassContext::getInstance(PersonData::class);
5955

6056
self::assertInstanceOf(PersonData::class, $classContext->newInstanceWithoutConstructor());
6157
}
@@ -66,16 +62,14 @@ public function can_create_an_instance_from_the_reflection_class(): void
6662
#[Test]
6763
public function will_sync_normalizers_from_attribute(): void
6864
{
69-
$reflectionClass = new ReflectionClass(PersonData::class);
70-
$classContext = ClassContext::getInstance($reflectionClass);
65+
$classContext = ClassContext::getInstance(PersonData::class);
7166

7267
self::assertEquals(
7368
[DummyNormalizer::class, HumanToPersonNormalizer::class],
7469
$classContext->normalizers
7570
);
7671

77-
$reflectionClass = new ReflectionClass(DummyWithNormalizerData::class);
78-
$classContext = ClassContext::getInstance($reflectionClass);
72+
$classContext = ClassContext::getInstance(DummyWithNormalizerData::class);
7973

8074
self::assertEquals(
8175
[DummyNormalizer::class],

0 commit comments

Comments
 (0)