Skip to content

Commit

Permalink
one can now register handler classes through particles.
Browse files Browse the repository at this point in the history
  • Loading branch information
esokullu committed Jul 19, 2017
1 parent f393709 commit aab0af3
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 28 deletions.
23 changes: 19 additions & 4 deletions src/Pho/Framework/Handlers/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,31 @@ public static function handle(
array $args
): \Pho\Lib\Graph\EntityInterface
{
$class = self::findFormativeClass($name, $args, $pack);
$class = static::findFormativeClass($name, $args, $pack);
$head = static::formHead($particle, $args);
$edge_class = $pack["out"]->formative_label_class_pairs[$name];
$edge = new $edge_class($particle, $head);
return $edge->return();
}

/**
* Forms the head particle.
*
* @param ParticleInterface $particle
* @param array $args
*
* @return void
*/
protected static function formHead(
ParticleInterface $particle,
array $args): void
{
if(count($args)>0) {
$head = new $class($particle, $particle->where(), ...$args);
}
else {
$head = new $class($particle, $particle->where());
}
$edge_class = $pack["out"]->formative_label_class_pairs[$name];
$edge = new $edge_class($particle, $head);
return $edge->return();
}

/**
Expand Down
49 changes: 39 additions & 10 deletions src/Pho/Framework/Handlers/Gateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
namespace Pho\Framework\Handlers;

use Pho\Framework\ParticleInterface;
use Pho\Framework\Exceptions\InvalidParticleMethodException;

/**
* Handler Gateway
Expand All @@ -24,6 +25,18 @@
class Gateway
{

/**
* Default Handler adapters
*
* @var array
*/
protected $adapters = [
"form" => __NAMESPACE__ . "\\Form::handle",
"get" => __NAMESPACE__ . "\\Get::handle",
"has" => __NAMESPACE__ . "\\Has::handle",
"set" => __NAMESPACE__ . "\\Set::handle"
];

/**
* The particle that this handler is associated with.
*
Expand Down Expand Up @@ -61,6 +74,21 @@ public function __construct(ParticleInterface $particle) {
$this->particle = $particle;
}

/**
* Registers a new handler adapter.
*
* Default handlers may be overriden.
*
* @param string $key Adapter key; e.g. "get", "set", "form" etc.
* @param string $class Handler class to register. A handler class shall implement HandlerInterface
*
* @return void
*/
public function registerHandlerAdapter(string $key, string $class): void
{
$this->adapters[$key] = $class;
}

/**
* Packs cargo variables
*
Expand Down Expand Up @@ -91,27 +119,28 @@ protected function pack(): array
*/
public function switch(string $name, array $args) /*: \Pho\Lib\Graph\EntityInterface*/
{
$deliver = function(string $key) use ($name, $args) {
$class = $this->adapters[$key];
return $class($this->particle, $this->pack(), $name, $args);
};

if(in_array($name, $this->cargo_out->setter_labels)) {
return Set::handle($this->particle, $this->pack(), $name, $args);
return $deliver("set");
}
else if(in_array($name, $this->cargo_out->formative_labels)) {
return Form::handle($this->particle, $this->pack(), $name, $args);
return $deliver("form");
}
else if(strlen($name) > 3) {
$func_prefix = substr($name, 0, 3);
$funcs = [
"get"=> __NAMESPACE__ . "\\Get::handle",
"has"=> __NAMESPACE__ . "\\Has::handle",
"set"=> __NAMESPACE__ . "\\Set::handle",
];
if (array_key_exists($func_prefix, $funcs) ) {
if (array_key_exists($func_prefix, $this->adapters) ) {
try {
return $funcs[$func_prefix]($this->particle, $this->pack(), $name, $args);
return $deliver($func_prefix);
}
catch(\Pho\Framework\Exceptions\InvalidParticleMethodException $e) {
catch(\Exception $e) {
throw $e;
}
}
}
throw new InvalidParticleMethodException(__CLASS__, $name);
}
}
12 changes: 6 additions & 6 deletions src/Pho/Framework/Handlers/Get.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,14 @@ public static function handle(
) /*: array*/
{
$name = substr($name, 3);
if(self::methodExists($pack, $name, Direction::out())) {
return self::getEdgeNodes($particle, $pack, $name, Direction::out());
if(static::methodExists($pack, $name, Direction::out())) {
return static::getEdgeNodes($particle, $pack, $name, Direction::out());
}
elseif(self::methodExists($pack, $name, Direction::in())) {
return self::getEdgeNodes($particle, $pack, $name, Direction::in());
elseif(static::methodExists($pack, $name, Direction::in())) {
return static::getEdgeNodes($particle, $pack, $name, Direction::in());
}
elseif( FieldHelper::fieldExists($pack["fields"], $name) ) {
return self::getField($particle, $pack["fields"], $name, $args);
return static::getField($particle, $pack["fields"], $name, $args);
}
throw new \Pho\Framework\Exceptions\InvalidParticleMethodException(__CLASS__, $name);
}
Expand Down Expand Up @@ -118,7 +118,7 @@ protected static function getEdgeNodes(
{
$name = strtolower($name);
$direction = (string) $direction;
$node_adj = self::ADJACENCY_EQUIVALENT[$direction];
$node_adj = static::ADJACENCY_EQUIVALENT[$direction];
$cargo = $pack[$direction];
$edges = $particle->edges()->$direction();
$return = [];
Expand Down
10 changes: 5 additions & 5 deletions src/Pho/Framework/Handlers/Has.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ public static function handle(
$name = strtolower(substr($name, 3));


if(self::methodExists($pack, $name, $id, Direction::out())) {
return self::checkEdgeNode($particle, $pack, $name, $id, Direction::out());
if(static::methodExists($pack, $name, $id, Direction::out())) {
return static::checkEdgeNode($particle, $pack, $name, $id, Direction::out());
}
elseif(self::methodExists($pack, $name, $id, Direction::in())) {
return self::checkEdgeNode($particle, $pack, $name, $id, Direction::in());
elseif(static::methodExists($pack, $name, $id, Direction::in())) {
return static::checkEdgeNode($particle, $pack, $name, $id, Direction::in());
}

throw new \Pho\Framework\InvalidParticleMethodException(__CLASS__, $original_name);
Expand Down Expand Up @@ -106,7 +106,7 @@ protected static function checkEdgeNode(
): bool
{
$direction = (string) $direction;
$node_adj = self::ADJACENCY_EQUIVALENT[$direction];
$node_adj = static::ADJACENCY_EQUIVALENT[$direction];
$cargo = $pack[$direction];
$edges = $particle->edges()->$direction();
foreach($edges as $edge) {
Expand Down
6 changes: 3 additions & 3 deletions src/Pho/Framework/Handlers/Set.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public static function handle(
) /*: \Pho\Lib\Graph\EntityInterface*/
{
if( FieldHelper::fieldExists($pack["fields"], substr($name, 3)) ) {
return self::field($particle, $pack["fields"], substr($name, 3), $args[0]);
return static::field($particle, $pack["fields"], substr($name, 3), $args[0]);
}
$check = false;
foreach($pack["out"]->setter_label_settable_pairs[$name] as $settable) {
Expand Down Expand Up @@ -71,9 +71,9 @@ protected static function field(
{
$name = FieldHelper::findFieldName($cargo, $name);
if(isset($cargo->fields[$name]["constraints"])) {
self::probeField($cargo->fields[$name]["constraints"], $value);
static::probeField($cargo->fields[$name]["constraints"], $value);
}
$particle->attributes()->$name = self::applyDirectives($value, $cargo->fields[$name]);
$particle->attributes()->$name = static::applyDirectives($value, $cargo->fields[$name]);
}

/**
Expand Down
15 changes: 15 additions & 0 deletions src/Pho/Framework/ParticleTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,21 @@ public function registerOutgoingEdgeClass(string $class): void
);
}

/**
* Registers a new handler adapter.
*
* Default handlers may be overriden.
*
* @param string $key Adapter key; e.g. "get", "set", "form" etc.
* @param string $class Handler class to register. A handler class shall implement HandlerInterface
*
* @return void
*/
public function registerHandlerAdapter(string $key, string $class): void
{
$this->handler->adapters[$key] = $class;
}

/**
* @internal
*
Expand Down

0 comments on commit aab0af3

Please sign in to comment.