Skip to content
This repository has been archived by the owner on Apr 20, 2018. It is now read-only.

Commit

Permalink
first running version on bidirectional add/remove/set
Browse files Browse the repository at this point in the history
  • Loading branch information
dominikzogg committed Sep 22, 2014
1 parent 7af306c commit 43a050e
Show file tree
Hide file tree
Showing 10 changed files with 566 additions and 21 deletions.
20 changes: 13 additions & 7 deletions src/Saxulum/Accessor/Accessors/AbstractWrite.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,17 @@ abstract class AbstractWrite implements AccessorInterface
*/
public function callback($object, &$property, Prop $prop, array $arguments = array())
{
if (!array_key_exists(0, $arguments) || count($arguments) !== 1) {
throw new \InvalidArgumentException($this->getPrefix() . ' accessor allows only one argument!');
if (!array_key_exists(0, $arguments)) {
throw new \InvalidArgumentException($this->getPrefix() . ' accessor needs at least a value!');
}

Hint::validateOrException($prop->getName(), $arguments[0], $prop->getHint(), $prop->getNullable());
$value = $arguments[0];
$stopPropagation = isset($arguments[1]) ? $arguments[1] : false;

Hint::validateOrException($prop->getName(), $value, $prop->getHint(), $prop->getNullable());

$this->propertyDefault($property);
$this->updateProperty($property, $prop, $arguments[0]);
$this->updateProperty($object, $property, $prop, $value, $stopPropagation);

return $object;
}
Expand All @@ -42,20 +45,23 @@ abstract protected function propertyDefault(&$property);
abstract protected function getSubType(&$property);

/**
* @param object $object
* @param mixed $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function updateProperty(&$property, Prop $prop, $value)
protected function updateProperty($object, &$property, Prop $prop, $value, $stopPropagation = false)
{
$type = $this->getSubType($property);
$method = $this->getPrefix() . ucfirst($type);
$remoteType = (string) $prop->getRemoteType();
$method = $this->getPrefix() . ucfirst($type) . ucfirst($remoteType);

if (!is_callable(array($this, $method))) {
throw new \Exception("Unsupported type '{$type}' for property '{$prop->getName()}' by accessor!");
}

$this->$method($property, $value);
$this->$method($object, $property, $prop, $value, $stopPropagation);
}
}
119 changes: 114 additions & 5 deletions src/Saxulum/Accessor/Accessors/Add.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Saxulum\Accessor\Accessors;

use Doctrine\Common\Collections\Collection;
use Saxulum\Accessor\Prop;

class Add extends AbstractCollection
{
Expand All @@ -17,24 +18,132 @@ public function getPrefix()
}

/**
* @param array $property
* @param $value
* @param object $object
* @param array $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
*/
protected function addArray(array &$property, $value)
protected function addArray($object, array &$property, Prop $prop, $value, $stopPropagation = false)
{
if (!in_array($value, $property, true)) {
$property[] = $value;
}
}

/**
* @param object $object
* @param array $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function addArrayOne($object, array &$property, Prop $prop, $value, $stopPropagation = false)
{
if (!in_array($value, $property, true)) {
$this->addOne($object, $prop, $value, $stopPropagation);
$property[] = $value;
}
}

/**
* @param object $object
* @param array $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function addArrayMany($object, array &$property, Prop $prop, $value, $stopPropagation = false)
{
if (!in_array($value, $property, true)) {
$this->addMany($object, $prop, $value, $stopPropagation);
$property[] = $value;
}
}

/**
* @param object $object
* @param Collection $property
* @param $value
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
*/
protected function addCollection($object, Collection &$property, Prop $prop, $value, $stopPropagation = false)
{
if (!$property->contains($value)) {
$property->add($value);
}
}

/**
* @param object $object
* @param Collection $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function addCollection(Collection &$property, $value)
protected function addCollectionOne($object, Collection &$property, Prop $prop, $value, $stopPropagation = false)
{
if (!$property->contains($value)) {
$this->addOne($object, $prop, $value, $stopPropagation);
$property->add($value);
}
}

/**
* @param object $object
* @param Collection $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function addCollectionMany($object, Collection &$property, Prop $prop, $value, $stopPropagation = false)
{
if (!$property->contains($value)) {
$this->addMany($object, $prop, $value, $stopPropagation);
$property->add($value);
}
}

/**
* @param mixed $object
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function addOne($object, Prop $prop, $value, $stopPropagation = false)
{
if (null === $remoteName = $prop->getRemoteName()) {
throw new \Exception("Remote name needs to be set on '{$prop->getName()}', if remote type is given!");
}

if (!$stopPropagation) {
$setMethod = Set::PREFIX . ucfirst($remoteName);
$value->$setMethod($object, true);
}
}

/**
* @param mixed $object
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function addMany($object, Prop $prop, $value, $stopPropagation = false)
{
if (null === $remoteName = $prop->getRemoteName()) {
throw new \Exception("Remote name needs to be set on '{$prop->getName()}', if remote type is given!");
}

if (!$stopPropagation) {
$addMethod = Add::PREFIX . ucfirst($remoteName);
$value->$addMethod($object, true);
}
}
}
121 changes: 117 additions & 4 deletions src/Saxulum/Accessor/Accessors/Remove.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Saxulum\Accessor\Accessors;

use Doctrine\Common\Collections\Collection;
use Saxulum\Accessor\Prop;

class Remove extends AbstractCollection
{
Expand All @@ -17,10 +18,13 @@ public function getPrefix()
}

/**
* @param array $property
* @param mixed $value
* @param object $object
* @param array $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
*/
protected function removeArray(array &$property, $value)
protected function removeArray($object, array &$property, Prop $prop, $value, $stopPropagation = false)
{
$key = array_search($value, $property, true);

Expand All @@ -30,13 +34,122 @@ protected function removeArray(array &$property, $value)
}

/**
* @param object $object
* @param array $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function removeArrayOne($object, array &$property, Prop $prop, $value, $stopPropagation = false)
{
$key = array_search($value, $property, true);

if (false !== $key) {
$this->removeOne($object, $prop, $value, $stopPropagation);
unset($property[$key]);
}
}

/**
* @param object $object
* @param array $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function removeArrayMany($object, array &$property, Prop $prop, $value, $stopPropagation = false)
{
$key = array_search($value, $property, true);

if (false !== $key) {
$this->removeMany($object, $prop, $value, $stopPropagation);
unset($property[$key]);
}
}

/**
* @param object $object
* @param Collection $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
*/
protected function removeCollection($object, Collection &$property, Prop $prop, $value, $stopPropagation = false)
{
if ($property->contains($value)) {
$property->removeElement($value);
}
}

/**
* @param object $object
* @param Collection $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function removeCollection(Collection &$property, $value)
protected function removeCollectionOne($object, Collection &$property, Prop $prop, $value, $stopPropagation = false)
{
if ($property->contains($value)) {
$this->removeOne($object, $prop, $value, $stopPropagation);
$property->removeElement($value);
}
}

/**
* @param object $object
* @param Collection $property
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function removeCollectionMany($object, Collection &$property, Prop $prop, $value, $stopPropagation = false)
{
if ($property->contains($value)) {
$this->removeMany($object, $prop, $value, $stopPropagation);
$property->removeElement($value);
}
}

/**
* @param mixed $object
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function removeOne($object, Prop $prop, $value, $stopPropagation = false)
{
if (null === $remoteName = $prop->getRemoteName()) {
throw new \Exception("Remote name needs to be set on '{$prop->getName()}', if remote type is given!");
}

if (!$stopPropagation) {
$setMethod = Set::PREFIX . ucfirst($remoteName);
$value->$setMethod($object, true);
}
}

/**
* @param mixed $object
* @param Prop $prop
* @param mixed $value
* @param bool $stopPropagation
* @throws \Exception
*/
protected function removeMany($object, Prop $prop, $value, $stopPropagation = false)
{
if (null === $remoteName = $prop->getRemoteName()) {
throw new \Exception("Remote name needs to be set on '{$prop->getName()}', if remote type is given!");
}

if (!$stopPropagation) {
$removeMethod = Remove::PREFIX . ucfirst($remoteName);
$value->$removeMethod($object, true);
}
}
}
Loading

0 comments on commit 43a050e

Please sign in to comment.