Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 class MetaClass
00016 {
00017 private $name = null;
00018 private $tableName = null;
00019 private $type = null;
00020
00021 private $parent = null;
00022
00023 private $properties = array();
00024 private $interfaces = array();
00025 private $references = array();
00026
00027 private $pattern = null;
00028 private $identifier = null;
00029
00030 private $source = null;
00031
00032 private $strategy = null;
00033
00034 private $build = true;
00035
00036 public function __construct($name)
00037 {
00038 $this->name = $name;
00039
00040 $dumb = strtolower(
00041 preg_replace(':([A-Z]):', '_\1', $name)
00042 );
00043
00044 if ($dumb[0] == '_')
00045 $this->tableName = substr($dumb, 1);
00046 else
00047 $this->tableName = $dumb;
00048 }
00049
00050 public function getName()
00051 {
00052 return $this->name;
00053 }
00054
00055 public function getTableName()
00056 {
00057 return $this->tableName;
00058 }
00059
00063 public function setTableName($name)
00064 {
00065 $this->tableName = $name;
00066
00067 return $this;
00068 }
00069
00073 public function getType()
00074 {
00075 return $this->type;
00076 }
00077
00078 public function getTypeId()
00079 {
00080 return
00081 $this->type
00082 ? $this->type->getId()
00083 : null;
00084 }
00085
00089 public function setType(MetaClassType $type)
00090 {
00091 $this->type = $type;
00092
00093 return $this;
00094 }
00095
00099 public function getParent()
00100 {
00101 return $this->parent;
00102 }
00103
00107 public function getFinalParent()
00108 {
00109 if ($this->parent)
00110 return $this->parent->getFinalParent();
00111
00112 return $this;
00113 }
00114
00118 public function setParent(MetaClass $parent)
00119 {
00120 $this->parent = $parent;
00121
00122 return $this;
00123 }
00124
00125 public function hasBuildableParent()
00126 {
00127 return (
00128 $this->parent
00129 && (
00130 !$this->getParent()->getPattern()
00131 instanceof InternalClassPattern
00132 )
00133 );
00134 }
00135
00136 public function getProperties()
00137 {
00138 return $this->properties;
00139 }
00140
00142 public function getAllProperties()
00143 {
00144 if ($this->parent)
00145 return array_merge(
00146 $this->parent->getAllProperties(),
00147 $this->properties
00148 );
00149
00150 return $this->getProperties();
00151 }
00152
00154 public function getWithInternalProperties()
00155 {
00156 if ($this->parent) {
00157 $out = $this->properties;
00158
00159 $class = $this;
00160
00161 while ($parent = $class->getParent()) {
00162 if ($parent->getPattern() instanceof InternalClassPattern) {
00163 $out = array_merge($parent->getProperties(), $out);
00164 }
00165
00166 $class = $parent;
00167 }
00168
00169 return $out;
00170 }
00171
00172 return $this->getProperties();
00173 }
00174
00176 public function getAllParentsProperties()
00177 {
00178 $out = array();
00179
00180 $class = $this;
00181
00182 while ($parent = $class->getParent()) {
00183 $out = array_merge($out, $parent->getProperties());
00184 $class = $parent;
00185 }
00186
00187 return $out;
00188 }
00189
00193 public function addProperty(MetaClassProperty $property)
00194 {
00195 $name = $property->getName();
00196
00197 if (!isset($this->properties[$name]))
00198 $this->properties[$name] = $property;
00199 else
00200 throw new WrongArgumentException(
00201 "property '{$name}' already exist"
00202 );
00203
00204 if ($property->isIdentifier())
00205 $this->identifier = $property;
00206
00207 return $this;
00208 }
00209
00214 public function getPropertyByName($name)
00215 {
00216 if (isset($this->properties[$name]))
00217 return $this->properties[$name];
00218
00219 throw new MissingElementException("unknown property '{$name}'");
00220 }
00221
00222 public function hasProperty($name)
00223 {
00224 return isset($this->properties[$name]);
00225 }
00226
00230 public function dropProperty($name)
00231 {
00232 if (isset($this->properties[$name])) {
00233
00234 if ($this->properties[$name]->isIdentifier())
00235 unset($this->identifier);
00236
00237 unset($this->properties[$name]);
00238
00239 } else
00240 throw new MissingElementException(
00241 "property '{$name}' does not exist"
00242 );
00243
00244 return $this;
00245 }
00246
00247 public function getInterfaces()
00248 {
00249 return $this->interfaces;
00250 }
00251
00255 public function addInterface($name)
00256 {
00257 $this->interfaces[] = $name;
00258
00259 return $this;
00260 }
00261
00265 public function getPattern()
00266 {
00267 return $this->pattern;
00268 }
00269
00273 public function setPattern(GenerationPattern $pattern)
00274 {
00275 $this->pattern = $pattern;
00276
00277 return $this;
00278 }
00279
00283 public function getIdentifier()
00284 {
00285
00286 if (!$this->identifier && $this->parent)
00287 return $this->parent->getIdentifier();
00288
00289 return $this->identifier;
00290 }
00291
00295 public function setSourceLink($link)
00296 {
00297 $this->source = $link;
00298
00299 return $this;
00300 }
00301
00302 public function getSourceLink()
00303 {
00304 return $this->source;
00305 }
00306
00310 public function setReferencingClass($className)
00311 {
00312 $this->references[$className] = true;
00313
00314 return $this;
00315 }
00316
00317 public function getReferencingClasses()
00318 {
00319 return array_keys($this->references);
00320 }
00321
00325 public function setFetchStrategy(FetchStrategy $strategy)
00326 {
00327 $this->strategy = $strategy;
00328
00329 return $this;
00330 }
00331
00335 public function getFetchStrategy()
00336 {
00337 return $this->strategy;
00338 }
00339
00340 public function getFetchStrategyId()
00341 {
00342 if ($this->strategy)
00343 return $this->strategy->getId();
00344
00345 return null;
00346 }
00347
00348 public function hasChilds()
00349 {
00350 foreach (MetaConfiguration::me()->getClassList() as $class) {
00351 if (
00352 $class->getParent()
00353 && $class->getParent()->getName() == $this->getName()
00354 )
00355 return true;
00356 }
00357
00358 return false;
00359 }
00360
00361 public function dump()
00362 {
00363 if ($this->doBuild())
00364 return $this->pattern->build($this);
00365
00366 return $this->pattern;
00367 }
00368
00369 public function doBuild()
00370 {
00371 return $this->build;
00372 }
00373
00377 public function setBuild($do)
00378 {
00379 $this->build = $do;
00380
00381 return $this;
00382 }
00383
00387 public function isRedefinedProperty($name)
00388 {
00389 $parent = $this;
00390
00391 while ($parent = $parent->getParent()) {
00392 if ($parent->hasProperty($name))
00393 return $parent->getPropertyByName($name);
00394 }
00395
00396 return false;
00397 }
00398 }
00399 ?>