AutoProtoClassBuilder.class.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************************
00003  *   Copyright (C) 2006-2008 by Konstantin V. Arkhipov                     *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU Lesser General Public License as        *
00007  *   published by the Free Software Foundation; either version 3 of the    *
00008  *   License, or (at your option) any later version.                       *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00015     final class AutoProtoClassBuilder extends BaseBuilder
00016     {
00017         public static function build(MetaClass $class)
00018         {
00019             $out = self::getHead();
00020             
00021             $parent = $class->getParent();
00022             
00023             if ($class->hasBuildableParent())
00024                 $parentName = 'Proto'.$parent->getName();
00025             else
00026                 $parentName = 'AbstractProtoClass';
00027             
00028             $out .= <<<EOT
00029 abstract class AutoProto{$class->getName()} extends {$parentName}
00030 {
00031 EOT;
00032             $classDump = self::dumpMetaClass($class);
00033             
00034             $out .= <<<EOT
00035 
00036 {$classDump}
00037 }
00038 
00039 EOT;
00040 
00041             return $out.self::getHeel();
00042         }
00043         
00044         private static function dumpMetaClass(MetaClass $class)
00045         {
00046             $propertyList = $class->getWithInternalProperties();
00047             
00048             $out = <<<EOT
00049     protected function makePropertyList()
00050     {
00051 
00052 EOT;
00053 
00054             if ($class->hasBuildableParent()) {
00055                 $out .= <<<EOT
00056         return
00057             array_merge(
00058                 parent::makePropertyList(),
00059                 array(
00060 
00061 EOT;
00062                 if ($class->getIdentifier()) {
00063                     $propertyList[$class->getIdentifier()->getName()] =
00064                         $class->getIdentifier();
00065                 }
00066             } else {
00067                 $out .= <<<EOT
00068         return array(
00069 
00070 EOT;
00071             }
00072             
00073             $list = array();
00074             
00075             foreach ($propertyList as $property) {
00076                 $list[] =
00077                     "'{$property->getName()}' => "
00078                     .$property->toLightProperty($class)->toString();
00079             }
00080             
00081             $out .= implode(",\n", $list);
00082             
00083             if ($class->hasBuildableParent()) {
00084                 $out .= "\n)";
00085             }
00086             
00087             $out .= <<<EOT
00088 
00089         );
00090     }
00091 EOT;
00092             return $out;
00093         }
00094     }
00095 ?>