Skip to content

Commit e54a416

Browse files
committed
Remove runtime reflection from CallbackRuntimeMeta, Callback
1 parent 069316a commit e54a416

17 files changed

+247
-113
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6363
- `Options` - `withProcessedClass()`, `getProcessedClass()` - no longer used
6464
- Runtime reflection (performance optimization), from:
6565
- `PropertyContext`
66+
- `CallbackRuntimeMeta`
67+
- `Callback`
6668

6769
## [0.3.0](https://github.com/orisai/object-mapper/compare/0.2.0...0.3.0) - 2025-01-21
6870

src/Callbacks/AfterMappingCallback.php

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Orisai\ObjectMapper\Callbacks\Context\ObjectContext;
1111
use Orisai\ObjectMapper\MappedObject;
1212
use Orisai\ObjectMapper\Meta\Context\MetaContext;
13+
use Orisai\ObjectMapper\Meta\Runtime\PhpMethodMeta;
1314
use Orisai\ObjectMapper\Processing\ObjectHolder;
1415
use ReflectionClass;
1516
use ReflectionMethod;
@@ -67,7 +68,9 @@ public static function resolveArgs(
6768
));
6869
}
6970

70-
return new AfterMappingCallbackArgs($methodName);
71+
return new AfterMappingCallbackArgs(
72+
PhpMethodMeta::from($method),
73+
);
7174
}
7275

7376
/**
@@ -212,20 +215,19 @@ public static function invoke(
212215
$data,
213216
Args $args,
214217
ObjectHolder $holder,
215-
CallbackBaseContext $context,
216-
ReflectionClass $declaringClass
218+
CallbackBaseContext $context
217219
)
218220
{
219-
$method = $args->method;
220-
$methodInst = $declaringClass->getMethod($method);
221+
$meta = $args->meta;
222+
$method = $meta->method;
221223

222224
$instance = $holder->getInstance();
223225

224226
// phpcs:disable SlevomatCodingStandard.Functions.StaticClosure.ClosureNotStatic
225-
$methodInst->isPublic()
227+
$meta->isPubliclyCallable
226228
? $instance->$method($context)
227229
: (fn () => $instance->$method($context))
228-
->bindTo($instance, $declaringClass->getName())();
230+
->bindTo($instance, $meta->declaringClass)();
229231
// phpcs:enable
230232

231233
return [];

src/Callbacks/AfterMappingCallbackArgs.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
namespace Orisai\ObjectMapper\Callbacks;
44

55
use Orisai\ObjectMapper\Args\Args;
6+
use Orisai\ObjectMapper\Meta\Runtime\PhpMethodMeta;
67

78
final class AfterMappingCallbackArgs implements Args
89
{
910

10-
public string $method;
11+
public PhpMethodMeta $meta;
1112

12-
public function __construct(string $method)
13+
public function __construct(PhpMethodMeta $meta)
1314
{
14-
$this->method = $method;
15+
$this->meta = $meta;
1516
}
1617

1718
}

src/Callbacks/Callback.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public static function getArgsType(): string;
3838
* @param T_ARGS $args
3939
* @param ObjectContext|FieldContext $context
4040
* @param ObjectHolder<MappedObject> $holder
41-
* @param ReflectionClass<covariant MappedObject> $declaringClass
4241
* @return mixed
4342
* @throws ValueDoesNotMatch
4443
* @throws InvalidData
@@ -47,8 +46,7 @@ public static function invoke(
4746
$data,
4847
Args $args,
4948
ObjectHolder $holder,
50-
CallbackBaseContext $context,
51-
ReflectionClass $declaringClass
49+
CallbackBaseContext $context
5250
);
5351

5452
}

src/Callbacks/ValidationCallback.php

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Orisai\ObjectMapper\Callbacks\Context\ObjectContext;
1212
use Orisai\ObjectMapper\MappedObject;
1313
use Orisai\ObjectMapper\Meta\Context\MetaContext;
14+
use Orisai\ObjectMapper\Meta\Runtime\PhpMethodMeta;
1415
use Orisai\ObjectMapper\Processing\ObjectHolder;
1516
use ReflectionClass;
1617
use ReflectionMethod;
@@ -73,6 +74,7 @@ public static function resolveArgs(
7374
}
7475

7576
if ($reflector instanceof ReflectionProperty) {
77+
/** @var ReflectionClass<MappedObject> $class */
7678
$class = $reflector->getDeclaringClass();
7779
$property = $reflector;
7880
} else {
@@ -83,10 +85,8 @@ public static function resolveArgs(
8385
$method = self::validateMethod($class, $property, $methodName);
8486

8587
return new ValidationCallbackArgs(
86-
$methodName,
87-
$method->isStatic(),
88-
self::getMethodReturnsValue($method),
8988
CallbackRuntime::from($runtime),
89+
PhpMethodMeta::from($method),
9090
);
9191
}
9292

@@ -272,14 +272,6 @@ protected static function getTypeName(?ReflectionType $type): ?string
272272
return $type->getName();
273273
}
274274

275-
/**
276-
* Method is expected to return data unless void or never return type is defined
277-
*/
278-
private static function getMethodReturnsValue(ReflectionMethod $method): bool
279-
{
280-
return !in_array(self::getTypeName($method->getReturnType()), ['void', 'never'], true);
281-
}
282-
283275
public static function getArgsType(): string
284276
{
285277
return ValidationCallbackArgs::class;
@@ -293,8 +285,7 @@ public static function invoke(
293285
$data,
294286
Args $args,
295287
ObjectHolder $holder,
296-
CallbackBaseContext $context,
297-
ReflectionClass $declaringClass
288+
CallbackBaseContext $context
298289
)
299290
{
300291
// Callback is skipped for unsupported runtime
@@ -303,28 +294,28 @@ public static function invoke(
303294
return $data;
304295
}
305296

306-
$method = $args->method;
307-
$methodInst = $declaringClass->getMethod($method);
297+
$meta = $args->meta;
298+
$method = $meta->method;
308299

309-
if ($args->isStatic) {
300+
if ($meta->isStatic) {
310301
$class = $holder->getClass();
311302

312-
$callbackOutput = $methodInst->isPublic()
303+
$callbackOutput = $meta->isPubliclyCallable
313304
? $class::$method($data, $context)
314305
: (static fn () => $class::$method($data, $context))
315-
->bindTo(null, $declaringClass->getName())();
306+
->bindTo(null, $meta->declaringClass)();
316307
} else {
317308
$instance = $holder->getInstance();
318309

319310
// phpcs:disable SlevomatCodingStandard.Functions.StaticClosure.ClosureNotStatic
320-
$callbackOutput = $methodInst->isPublic()
311+
$callbackOutput = $meta->isPubliclyCallable
321312
? $instance->$method($data, $context)
322313
: (fn () => $instance->$method($data, $context))
323-
->bindTo($instance, $declaringClass->getName())();
314+
->bindTo($instance, $meta->declaringClass)();
324315
// phpcs:enable
325316
}
326317

327-
return $args->returnsValue ? $callbackOutput : $data;
318+
return $meta->returnsValue ? $callbackOutput : $data;
328319
}
329320

330321
}

src/Callbacks/ValidationCallbackArgs.php

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,19 @@
33
namespace Orisai\ObjectMapper\Callbacks;
44

55
use Orisai\ObjectMapper\Args\Args;
6+
use Orisai\ObjectMapper\Meta\Runtime\PhpMethodMeta;
67

78
final class ValidationCallbackArgs implements Args
89
{
910

10-
public string $method;
11-
12-
public bool $isStatic;
13-
14-
public bool $returnsValue;
15-
1611
public CallbackRuntime $runtime;
1712

18-
public function __construct(
19-
string $method,
20-
bool $isStatic,
21-
bool $returnsValue,
22-
CallbackRuntime $runtime
23-
)
13+
public PhpMethodMeta $meta;
14+
15+
public function __construct(CallbackRuntime $runtime, PhpMethodMeta $meta)
2416
{
25-
$this->method = $method;
26-
$this->isStatic = $isStatic;
27-
$this->returnsValue = $returnsValue;
2817
$this->runtime = $runtime;
18+
$this->meta = $meta;
2919
}
3020

3121
}

src/Meta/MetaResolver.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private function resolveClassMeta(ReflectionClass $rootClass, CompileMeta $meta)
110110

111111
$context = new MetaContext($this->loader, $this);
112112

113-
$callbacksByMeta[] = $this->resolveCallbacksMeta($classMeta, $context, $reflector, $reflector);
113+
$callbacksByMeta[] = $this->resolveCallbacksMeta($classMeta, $context, $reflector);
114114
$docsByMeta[] = $this->resolveDocsMeta($classMeta, $context);
115115
$modifiersByMeta[] = $this->resolveClassModifiersMeta($classMeta, $context);
116116
}
@@ -252,7 +252,7 @@ private function resolveFieldMeta(
252252
$context = new MetaFieldContext($this->loader, $this, $defaultValue);
253253

254254
return new FieldRuntimeMeta(
255-
$this->resolveCallbacksMeta($meta, $context, $reflector, $classReflector),
255+
$this->resolveCallbacksMeta($meta, $context, $reflector),
256256
$this->resolveDocsMeta($meta, $context),
257257
$this->resolveFieldModifiersMeta($meta, $context),
258258
$this->resolveRuleMeta(
@@ -298,14 +298,12 @@ private function throwFieldMetaOutsideOfMappedObject(
298298

299299
/**
300300
* @param ReflectionClass<MappedObject>|ReflectionProperty $reflector
301-
* @param ReflectionClass<MappedObject> $classReflector
302301
* @return array<class-string<Callback<Args>>, list<CallbackRuntimeMeta<Args>>>
303302
*/
304303
private function resolveCallbacksMeta(
305304
NodeCompileMeta $meta,
306305
MetaContext $context,
307-
Reflector $reflector,
308-
ReflectionClass $classReflector
306+
Reflector $reflector
309307
): array
310308
{
311309
$array = [];
@@ -314,7 +312,6 @@ private function resolveCallbacksMeta(
314312
$callback,
315313
$context,
316314
$reflector,
317-
$classReflector,
318315
);
319316

320317
$array[$callbackMeta->type][] = $callbackMeta;
@@ -325,14 +322,12 @@ private function resolveCallbacksMeta(
325322

326323
/**
327324
* @param ReflectionClass<MappedObject>|ReflectionProperty $reflector
328-
* @param ReflectionClass<MappedObject> $declaringClass
329325
* @return CallbackRuntimeMeta<Args>
330326
*/
331327
private function resolveCallbackMeta(
332328
CallbackCompileMeta $meta,
333329
MetaContext $context,
334-
Reflector $reflector,
335-
ReflectionClass $declaringClass
330+
Reflector $reflector
336331
): CallbackRuntimeMeta
337332
{
338333
$type = $meta->getType();
@@ -349,7 +344,7 @@ private function resolveCallbackMeta(
349344
);
350345
}
351346

352-
return new CallbackRuntimeMeta($type, $args, $declaringClass);
347+
return new CallbackRuntimeMeta($type, $args);
353348
}
354349

355350
/**

src/Meta/Runtime/CallbackRuntimeMeta.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44

55
use Orisai\ObjectMapper\Args\Args;
66
use Orisai\ObjectMapper\Callbacks\Callback;
7-
use Orisai\ObjectMapper\MappedObject;
8-
use ReflectionClass;
97

108
/**
11-
* @phpstan-type T_SERIALIZED array{type: class-string<Callback<T>>, args: T, declaringClass: class-string<MappedObject>}
9+
* @phpstan-type T_SERIALIZED array{type: class-string<Callback<T>>, args: T}
1210
*
1311
* @template-covariant T of Args
1412
*
@@ -23,19 +21,14 @@ final class CallbackRuntimeMeta
2321
/** @var T */
2422
public Args $args;
2523

26-
/** @var ReflectionClass<covariant MappedObject> */
27-
public ReflectionClass $declaringClass;
28-
2924
/**
3025
* @param class-string<Callback<T>> $type
3126
* @param T $args
32-
* @param ReflectionClass<covariant MappedObject> $declaringClass
3327
*/
34-
public function __construct(string $type, Args $args, ReflectionClass $declaringClass)
28+
public function __construct(string $type, Args $args)
3529
{
3630
$this->type = $type;
3731
$this->args = $args;
38-
$this->declaringClass = $declaringClass;
3932
}
4033

4134
/**
@@ -46,7 +39,6 @@ public function __serialize(): array
4639
return [
4740
'type' => $this->type,
4841
'args' => $this->args,
49-
'declaringClass' => $this->declaringClass->getName(),
5042
];
5143
}
5244

@@ -57,7 +49,6 @@ public function __unserialize(array $data): void
5749
{
5850
$this->type = $data['type'];
5951
$this->args = $data['args'];
60-
$this->declaringClass = new ReflectionClass($data['declaringClass']);
6152
}
6253

6354
}

0 commit comments

Comments
 (0)