PrimitiveIdentifier.class.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************************
00003  *   Copyright (C) 2006-2009 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     class PrimitiveIdentifier extends IdentifiablePrimitive
00016     {
00017         private $methodName = 'getById';
00018         
00023         public function of($class)
00024         {
00025             $className = $this->guessClassName($class);
00026             
00027             Assert::classExists($className);
00028             
00029             Assert::isInstance(
00030                 $className,
00031                 'DAOConnected',
00032                 "class '{$className}' must implement DAOConnected interface"
00033             );
00034             
00035             $this->className = $className;
00036             
00037             return $this;
00038         }
00039         
00043         public function dao()
00044         {
00045             Assert::isNotNull(
00046                 $this->className,
00047                 'specify class name first of all'
00048             );
00049             
00050             return call_user_func(array($this->className, 'dao'));
00051         }
00052         
00056         public function setMethodName($methodName)
00057         {
00058             if (strpos($methodName, '::') === false) {
00059                 $dao = $this->dao();
00060                 
00061                 Assert::isTrue(
00062                     method_exists($dao, $methodName),
00063                     "knows nothing about '".get_class($dao)
00064                     ."::{$methodName}' method"
00065                 );
00066             } else
00067                 ClassUtils::checkStaticMethod($methodName);
00068             
00069             $this->methodName = $methodName;
00070             
00071             return $this;
00072         }
00073         
00074         public function importValue($value)
00075         {
00076             if ($value instanceof Identifiable) {
00077                 try {
00078                     Assert::isInstance($value, $this->className);
00079                     
00080                     return
00081                         $this->import(
00082                             array($this->getName() => $value->getId())
00083                         );
00084                 
00085                 } catch (WrongArgumentException $e) {
00086                     return false;
00087                 }
00088             }
00089             
00090             return parent::importValue($value);
00091         }
00092         
00093         public function import($scope)
00094         {
00095             if (!$this->className)
00096                 throw new WrongStateException(
00097                     "no class defined for PrimitiveIdentifier '{$this->name}'"
00098                 );
00099             
00100             $className = $this->className;
00101             
00102             if (
00103                 isset($scope[$this->name])
00104                 && $scope[$this->name] instanceof $className
00105             ) {
00106                 $value = $scope[$this->name];
00107                 
00108                 $this->raw = $value->getId();
00109                 $this->setValue($value);
00110                 
00111                 return $this->imported = true;
00112             }
00113             
00114             $result = parent::import($scope);
00115             
00116             if ($result === true) {
00117                 try {
00118                     $result = $this->actualImportValue($this->value);
00119                     
00120                     Assert::isInstance($result, $className);
00121                     
00122                     $this->value = $result;
00123                     
00124                     return true;
00125                 
00126                 } catch (WrongArgumentException $e) {
00127                     // not imported
00128                 } catch (ObjectNotFoundException $e) {
00129                     // not imported
00130                 }
00131                 
00132                 $this->value = null;
00133                 
00134                 return false;
00135             }
00136             
00137             return $result;
00138         }
00139         
00140         protected function actualImportValue($value)
00141         {
00142             return
00143                 (strpos($this->methodName, '::') === false)
00144                     ? $this->dao()->{$this->methodName}($value)
00145                     : ClassUtils::callStaticMethod(
00146                         $this->methodName, $value
00147                     );
00148         }
00149     }
00150 ?>