Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 final class AutoClassBuilder extends BaseBuilder
00016 {
00017 public static function build(MetaClass $class)
00018 {
00019 $out = self::getHead();
00020
00021 $out .= "abstract class Auto{$class->getName()}";
00022
00023 $isNamed = false;
00024
00025 if ($parent = $class->getParent())
00026 $out .= " extends {$parent->getName()}";
00027 elseif (
00028 $class->getPattern() instanceof DictionaryClassPattern
00029 && $class->hasProperty('name')
00030 ) {
00031 $out .= " extends NamedObject";
00032 $isNamed = true;
00033 } elseif (!$class->getPattern() instanceof ValueObjectPattern)
00034 $out .= " extends IdentifiableObject";
00035
00036 if ($interfaces = $class->getInterfaces())
00037 $out .= ' implements '.implode(', ', $interfaces);
00038
00039 $out .= "\n{\n";
00040
00041 foreach ($class->getProperties() as $property) {
00042 if (!self::doPropertyBuild($class, $property, $isNamed))
00043 continue;
00044
00045 $out .=
00046 "protected \${$property->getName()} = "
00047 ."{$property->getType()->getDeclaration()};\n";
00048
00049 if ($property->getFetchStrategyId() == FetchStrategy::LAZY) {
00050 $out .=
00051 "protected \${$property->getName()}Id = null;\n";
00052 }
00053 }
00054
00055 $valueObjects = array();
00056
00057 foreach ($class->getProperties() as $property) {
00058 if (
00059 $property->getType() instanceof ObjectType
00060 && !$property->getType()->isGeneric()
00061 && $property->getType()->getClass()->getPattern()
00062 instanceof ValueObjectPattern
00063 ) {
00064 $valueObjects[$property->getName()] =
00065 $property->getType()->getClassName();
00066 }
00067 }
00068
00069 if ($valueObjects) {
00070 $out .= <<<EOT
00071
00072 public function __construct()
00073 {
00074
00075 EOT;
00076 foreach ($valueObjects as $propertyName => $className) {
00077 $out .= "\$this->{$propertyName} = new {$className}();\n";
00078 }
00079
00080 $out .= "}\n";
00081 }
00082
00083 foreach ($class->getProperties() as $property) {
00084 if (!self::doPropertyBuild($class, $property, $isNamed))
00085 continue;
00086
00087 $out .= $property->toMethods($class);
00088 }
00089
00090 $out .= "}\n";
00091 $out .= self::getHeel();
00092
00093 return $out;
00094 }
00095
00096 private static function doPropertyBuild(
00097 MetaClass $class,
00098 MetaClassProperty $property,
00099 $isNamed
00100 )
00101 {
00102 if (
00103 $parentProperty =
00104 $class->isRedefinedProperty($property->getName())
00105 ) {
00106
00107 if (
00108 (
00109 $parentProperty->getFetchStrategyId()
00110 <> $property->getFetchStrategyId()
00111 ) && (
00112 $property->getFetchStrategyId() === FetchStrategy::LAZY
00113 )
00114 )
00115 return true;
00116
00117 return false;
00118 }
00119
00120 if ($isNamed && $property->getName() == 'name')
00121 return false;
00122
00123 if (
00124 ($property->getName() == 'id')
00125 && !$property->getClass()->getParent()
00126 )
00127 return false;
00128
00129
00130 if (
00131 $property->getClass()->getParent()
00132 && array_key_exists(
00133 $property->getName(),
00134 $property->getClass()->getAllParentsProperties()
00135 )
00136 )
00137 return false;
00138
00139 return true;
00140 }
00141 }
00142 ?>