Passed
Push — master ( 2279c5...1edf79 )
by Mr
06:36
created

EventHandlerTrait::applyEvent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
ccs 0
cts 3
cp 0
crap 2
rs 10
1
<?php declare(strict_types=1);
2
/**
3
 * This file is part of the daikon-cqrs/read-model project.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
9
namespace Daikon\ReadModel\Projection;
10
11
use Daikon\EventSourcing\Aggregate\Event\DomainEventInterface;
12
use Daikon\Interop\RuntimeException;
13
use ReflectionClass;
14
15
trait EventHandlerTrait
16
{
17
    public function applyEvent(DomainEventInterface $domainEvent): ProjectionInterface
18
    {
19
        return $this->invokeEventHandler($domainEvent);
20
    }
21
22
    private function invokeEventHandler(DomainEventInterface $event): ProjectionInterface
23
    {
24
        $handlerName = (new ReflectionClass($event))->getShortName();
25
        $handlerMethod = 'when'.ucfirst($handlerName);
26
        $projection = clone $this;
27
        $handler = [$projection, $handlerMethod];
28
        if (!is_callable($handler)) {
29
            throw new RuntimeException("Handler '$handlerMethod' is not callable on ".static::class);
30
        }
31
        return call_user_func($handler, $event);
32
    }
33
}
34