Skip to content

Commit

Permalink
omit creating ReflectionClass for all messages
Browse files Browse the repository at this point in the history
  • Loading branch information
Janos Szurovecz committed Feb 13, 2015
1 parent 09b7dd2 commit 8c66684
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 25 deletions.
5 changes: 2 additions & 3 deletions src/predaddy/commandhandling/CommandFunctionDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@

namespace predaddy\commandhandling;

use precore\lang\ObjectClass;
use predaddy\messagehandling\DefaultFunctionDescriptor;

final class CommandFunctionDescriptor extends DefaultFunctionDescriptor
Expand All @@ -33,8 +32,8 @@ protected function getBaseMessageClassName()
return __NAMESPACE__ . '\Command';
}

protected function canHandleValidMessage(ObjectClass $messageClass)
protected function canHandleValidMessage($object)
{
return $messageClass->getName() === $this->getHandledMessageClassName();
return get_class($object) === $this->getHandledMessageClassName();
}
}
18 changes: 9 additions & 9 deletions src/predaddy/messagehandling/DefaultFunctionDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
class DefaultFunctionDescriptor extends Object implements FunctionDescriptor
{
/**
* @var ObjectClass
* @var string
*/
private $handledMessageClass = null;
private $compatibleMessageClassNames = [];
Expand All @@ -67,17 +67,17 @@ public function __construct(CallableWrapper $callableWrapper, $priority)
}

/**
* @param ObjectClass $messageClass
* @param object $message
* @return boolean
*/
public function isHandlerFor(ObjectClass $messageClass)
public function isHandlerFor($message)
{
if (!$this->valid) {
return false;
}
$messageClassName = $messageClass->getName();
$messageClassName = get_class($message);
if (!array_key_exists($messageClassName, $this->compatibleMessageClassNames)) {
$this->compatibleMessageClassNames[$messageClassName] = $this->canHandleValidMessage($messageClass);
$this->compatibleMessageClassNames[$messageClassName] = $this->canHandleValidMessage($message);
}
return $this->compatibleMessageClassNames[$messageClassName];
}
Expand All @@ -95,7 +95,7 @@ public function isValid()
*/
public function getHandledMessageClassName()
{
return $this->handledMessageClass->getName();
return $this->handledMessageClass;
}

/**
Expand Down Expand Up @@ -140,9 +140,9 @@ public function getCallableWrapper()
return $this->callableWrapper;
}

protected function canHandleValidMessage(ObjectClass $messageClass)
protected function canHandleValidMessage($object)
{
return $this->handledMessageClass->isAssignableFrom($messageClass);
return is_a($object, $this->handledMessageClass);
}

protected function getBaseMessageClassName()
Expand All @@ -169,7 +169,7 @@ private function check()
return false;
}
}
$this->handledMessageClass = ObjectClass::forName($paramType->getName());
$this->handledMessageClass = $paramType->getName();
return true;
}
}
4 changes: 2 additions & 2 deletions src/predaddy/messagehandling/FunctionDescriptor.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ interface FunctionDescriptor extends Comparable, ObjectInterface
public function isValid();

/**
* @param ObjectClass $messageClass
* @param object $message
* @return boolean
*/
public function isHandlerFor(ObjectClass $messageClass);
public function isHandlerFor($message);

/**
* @return CallableWrapper
Expand Down
12 changes: 5 additions & 7 deletions src/predaddy/messagehandling/SimpleMessageBus.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
use ArrayObject;
use Closure;
use Exception;
use precore\lang\ObjectClass;
use precore\util\Collections;
use precore\util\Objects;
use SplHeap;
Expand Down Expand Up @@ -216,18 +215,17 @@ protected function dispatch($message, MessageCallback $callback)
*/
protected function callableWrappersFor($message)
{
$objectClass = ObjectClass::forName(get_class($message));
$heap = Collections::createHeap(Collections::reverseOrder());

self::insertAllHandlers($this->functionDescriptors, $heap, $objectClass);
self::insertAllHandlers($this->functionDescriptors, $heap, $message);

foreach ($this->factories as $factory) {
/* @var $factoryDescriptor FunctionDescriptor */
$factoryDescriptor = $this->factories[$factory];
if ($factoryDescriptor->isHandlerFor($objectClass)) {
if ($factoryDescriptor->isHandlerFor($message)) {
$handler = call_user_func($factory, $message);
$descriptor = $this->handlerDescriptorFactory->create($handler);
self::insertAllHandlers($descriptor->getFunctionDescriptors(), $heap, $objectClass);
self::insertAllHandlers($descriptor->getFunctionDescriptors(), $heap, $message);
}
}

Expand All @@ -239,11 +237,11 @@ protected function callableWrappersFor($message)
return $res;
}

private static function insertAllHandlers($functionDescriptors, SplHeap $heap, ObjectClass $objectClass)
private static function insertAllHandlers($functionDescriptors, SplHeap $heap, $message)
{
/* @var $functionDescriptor FunctionDescriptor */
foreach ($functionDescriptors as $functionDescriptor) {
if ($functionDescriptor->isHandlerFor($objectClass)) {
if ($functionDescriptor->isHandlerFor($message)) {
$heap->insert($functionDescriptor);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,15 @@ public function testIsHandlerFor()
{
$function = function (Message $message) {};
$descriptor = new DefaultFunctionDescriptor(new ClosureWrapper($function), self::$anyPriority);
self::assertTrue($descriptor->isHandlerFor(SimpleMessage::objectClass()));
self::assertTrue($descriptor->isHandlerFor(DeadMessage::objectClass()));
self::assertTrue($descriptor->isHandlerFor(new SimpleMessage()));
self::assertTrue($descriptor->isHandlerFor(new DeadMessage(null)));
}

public function testInvalidHandlerFunction()
{
$function = function ($message) {};
$descriptor = new DefaultFunctionDescriptor(new ClosureWrapper($function), self::$anyPriority);
self::assertFalse($descriptor->isHandlerFor(SimpleMessage::objectClass()));
self::assertFalse($descriptor->isHandlerFor(new SimpleMessage()));
}

public function testComparison()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public function testGetHandleMethodFor()
self::assertNotNull($methods);
$counter = 0;
foreach ($methods as $method) {
if ($method->isHandlerFor($message->getObjectClass())) {
if ($method->isHandlerFor($message)) {
$counter++;
}
}
Expand Down

0 comments on commit 8c66684

Please sign in to comment.