public static function build(MetaClass $class)
    {
        if (!$class->hasBuildableParent()) {
            return DictionaryDaoBuilder::build($class);
        } else {
            $parent = $class->getParent();
        }
        if ($class->getParent()->getPattern() instanceof InternalClassPattern) {
            $parentName = 'StorableDAO';
        } else {
            $parentName = $parent->getName() . 'DAO';
        }
        $out = self::getHead();
        $out .= <<<EOT
abstract class Auto{$class->getName()}DAO extends {$parentName}
{

EOT;
        $out .= self::buildPointers($class) . "\n}\n";
        return $out . self::getHeel();
    }
    private static function dumpMetaClass(MetaClass $class)
    {
        $propertyList = $class->getWithInternalProperties();
        $out = <<<EOT
\tprotected function makePropertyList()
\t{

EOT;
        if ($class->hasBuildableParent()) {
            $out .= <<<EOT
\t\treturn
\t\t\tarray_merge(
\t\t\t\tparent::makePropertyList(),
\t\t\t\tarray(

EOT;
            if ($class->getIdentifier()) {
                $propertyList[$class->getIdentifier()->getName()] = $class->getIdentifier();
            }
        } else {
            $out .= <<<EOT
\t\treturn array(

EOT;
        }
        $list = array();
        foreach ($propertyList as $property) {
            $list[] = "'{$property->getName()}' => " . $property->toLightProperty($class)->toString();
        }
        $out .= implode(",\n", $list);
        if ($class->hasBuildableParent()) {
            $out .= "\n)";
        }
        $out .= <<<EOT

\t\t);
\t}
EOT;
        return $out;
    }