BusinessClassBuilder.class.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************************
00003  *   Copyright (C) 2006-2007 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 BusinessClassBuilder extends OnceBuilder
00016     {
00017         public static function build(MetaClass $class)
00018         {
00019             $out = self::getHead();
00020             
00021             if ($type = $class->getType())
00022                 $typeName = $type->toString().' ';
00023             else
00024                 $typeName = null;
00025             
00026             $interfaces = ' implements Prototyped';
00027             
00028             if (
00029                 $class->getPattern()->daoExists()
00030                 && (!$class->getPattern() instanceof AbstractClassPattern)
00031             ) {
00032                 $interfaces .= ', DAOConnected';
00033                 
00034                 $daoName = $class->getName().'DAO';
00035                 $dao = <<<EOT
00039     public static function dao()
00040     {
00041         return Singleton::getInstance('{$daoName}');
00042     }
00043 
00044 EOT;
00045             } else
00046                 $dao = null;
00047             
00048             $out .= <<<EOT
00049 {$typeName}class {$class->getName()} extends Auto{$class->getName()}{$interfaces}
00050 {
00051 EOT;
00052 
00053             if (!$type || $type->getId() !== MetaClassType::CLASS_ABSTRACT) {
00054                 $customCreate = null;
00055                 
00056                 if (
00057                     $class->getFinalParent()->getPattern()
00058                         instanceof InternalClassPattern
00059                 ) {
00060                     $parent = $class;
00061                     
00062                     while ($parent = $parent->getParent()) {
00063                         $info = new ReflectionClass($parent->getName());
00064                         
00065                         if (
00066                             $info->hasMethod('create')
00067                             && ($info->getMethod('create')->getParameters() > 0)
00068                         ) {
00069                             $customCreate = true;
00070                             break;
00071                         }
00072                     }
00073                 }
00074                 
00075                 if ($customCreate) {
00076                     $creator = $info->getMethod('create');
00077                     
00078                     $declaration = array();
00079                     
00080                     foreach ($creator->getParameters() as $parameter) {
00081                         $declaration[] =
00082                             '$'.$parameter->getName()
00083                             // no one can live without default value @ ::create
00084                             .' = '
00085                             .(
00086                                 $parameter->getDefaultValue()
00087                                     ? $parameter->getDefaultValue()
00088                                     : 'null'
00089                             );
00090                     }
00091                     
00092                     $declaration = implode(', ', $declaration);
00093                     
00094                     $out .= <<<EOT
00095 
00099     public static function create({$declaration})
00100     {
00101         return new self({$declaration});
00102     }
00103         
00104 EOT;
00105                 } else {
00106                     $out .= <<<EOT
00107 
00111     public static function create()
00112     {
00113         return new self;
00114     }
00115         
00116 EOT;
00117                 }
00118                 
00119                 $protoName = 'Proto'.$class->getName();
00120             
00121                 $out .= <<<EOT
00122 
00123 {$dao}
00127     public static function proto()
00128     {
00129         return Singleton::getInstance('{$protoName}');
00130     }
00131 
00132 EOT;
00133 
00134             }
00135             
00136             $out .= <<<EOT
00137 
00138     // your brilliant stuff goes here
00139 }
00140 
00141 EOT;
00142             return $out.self::getHeel();
00143         }
00144     }
00145 ?>