Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 final class DTOSetter extends PrototypedSetter
00013 {
00014 private $getter = null;
00015
00016 public function set($name, $value)
00017 {
00018 if (!isset($this->mapping[$name]))
00019 throw new WrongArgumentException(
00020 "knows nothing about property '{$name}'"
00021 );
00022
00023 $primitive = $this->mapping[$name];
00024
00025 $setter = 'set'.ucfirst($primitive->getName());
00026
00027 if (!method_exists($this->object, $setter))
00028 throw new WrongArgumentException(
00029 "cannot find mutator for '$name' in class "
00030 .get_class($this->object)
00031 );
00032
00033 if (is_object($value)) {
00034
00035 if (
00036 ($primitive instanceof PrimitiveAnyType)
00037 && ($value instanceof PrototypedEntity)
00038 )
00039 $value =
00040 ObjectToDTOConverter::create($value->entityProto())->
00041 make($value);
00042 else
00043 $value = $this->dtoValue($value, $primitive);
00044
00045 } elseif (is_array($value) && is_object(current($value))) {
00046
00047 $dtoValue = array();
00048
00049 foreach ($value as $oneValue) {
00050 Assert::isTrue(
00051 is_object($oneValue),
00052 'array must contain only objects'
00053 );
00054
00055 $dtoValue[] = $this->dtoValue($oneValue, $primitive);
00056 }
00057
00058 $value = $dtoValue;
00059 }
00060
00061 return $this->object->$setter($value);
00062 }
00063
00064
00065 private function dtoValue($value, BasePrimitive $primitive)
00066 {
00067 $result = null;
00068
00069 if ($value instanceof DTOClass) {
00070
00071 $result = $value;
00072
00073 } elseif ($primitive instanceof PrimitivePolymorphicIdentifier) {
00074
00075 $result = PrimitivePolymorphicIdentifier::export($value);
00076
00077 } elseif ($primitive instanceof PrimitiveBoolean) {
00078
00079 $result = (boolean)$value;
00080
00081 } elseif ($value instanceof Identifiable) {
00082
00083 $result = $value->getId();
00084
00085 } elseif (
00086 $value instanceof Stringable
00087 ) {
00088 $result = $value->toString();
00089
00090 } else
00091 throw new WrongArgumentException(
00092 'don\'t know how to convert to DTO value of class '
00093 .get_class($value)
00094 );
00095
00096 return $result;
00097 }
00098
00102 public function getGetter()
00103 {
00104 if (!$this->getter) {
00105 $this->getter = new DTOGetter($this->proto, $this->object);
00106 }
00107
00108 return $this->getter;
00109 }
00110 }
00111 ?>