public static function build(MetaClass $class) { $out = self::getHead(); $out .= "abstract class Auto{$class->getName()}"; $isNamed = false; if ($parent = $class->getParent()) { $out .= " extends {$parent->getName()}"; } elseif ($class->getPattern() instanceof DictionaryClassPattern && $class->hasProperty('name')) { $out .= " extends NamedObject"; $isNamed = true; } elseif (!$class->getPattern() instanceof ValueObjectPattern) { $out .= " extends IdentifiableObject"; } if ($interfaces = $class->getInterfaces()) { $out .= ' implements ' . implode(', ', $interfaces); } $out .= "\n{\n"; foreach ($class->getProperties() as $property) { if (!self::doPropertyBuild($class, $property, $isNamed)) { continue; } $out .= "protected \${$property->getName()} = " . "{$property->getType()->getDeclaration()};\n"; if ($property->getFetchStrategyId() == FetchStrategy::LAZY) { $out .= "protected \${$property->getName()}Id = null;\n"; } } $valueObjects = array(); foreach ($class->getProperties() as $property) { if ($property->getType() instanceof ObjectType && !$property->getType()->isGeneric() && $property->getType()->getClass()->getPattern() instanceof ValueObjectPattern) { $valueObjects[$property->getName()] = $property->getType()->getClassName(); } } if ($valueObjects) { $out .= <<<EOT public function __construct() { EOT; foreach ($valueObjects as $propertyName => $className) { $out .= "\$this->{$propertyName} = new {$className}();\n"; } $out .= "}\n"; } foreach ($class->getProperties() as $property) { if (!self::doPropertyBuild($class, $property, $isNamed)) { continue; } $out .= $property->toMethods($class); } $out .= "}\n"; $out .= self::getHeel(); return $out; }