Raised DBAL version from 1.1.5 to 1.1.6
[Packages/TYPO3.CMS.git] / typo3 / sysext / extbase / Classes / Reflection / ObjectAccess.php
index e7fdb5f..5a4710d 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @package Extbase
  * @subpackage Reflection
- * @version $Id: ObjectAccess.php 1481 2009-10-21 09:44:20Z sebastian $
+ * @version $Id: ObjectAccess.php 2149 2010-03-30 09:28:54Z jocrau $
  */
 class Tx_Extbase_Reflection_ObjectAccess {
 
@@ -43,48 +43,63 @@ class Tx_Extbase_Reflection_ObjectAccess {
        /**
         * Get a property of a given object.
         * Tries to get the property the following ways:
+        * - if the target is an array, and has this property, we call it.
+        * - if public getter method exists, call it.
         * - if the target object is an instance of ArrayAccess, it gets the property
         *   on it if it exists.
-        * - if public getter method exists, call it.
         * - if public property exists, return the value of it.
         * - else, throw exception
         *
-        * @param object $object Object to get the property from
+        * @param mixed $subject Object or array to get the property from
         * @param string $propertyName name of the property to retrieve
         * @return object Value of the property.
+        * @throws InvalidArgumentException in case $subject was not an object or $propertyName was not a string
+        * @throws RuntimeException if the property was not accessible
         */
-       static public function getProperty($object, $propertyName) {
-               if (!is_object($object) && !is_array($object)) throw new InvalidArgumentException('$object must be an object or an array, ' . gettype($object). ' given.', 1237301367);
+       static public function getProperty($subject, $propertyName) {
+               if (!is_object($subject) && !is_array($subject)) throw new InvalidArgumentException('$subject must be an object or array, ' . gettype($subject). ' given.', 1237301367);
                if (!is_string($propertyName)) throw new InvalidArgumentException('Given property name is not of type string.', 1231178303);
 
-               if (is_array($object) && array_key_exists($propertyName, $object)) {
-                       return $object[$propertyName];
-               } elseif (is_callable(array($object, $getterMethodName = self::buildGetterMethodName($propertyName)))) {
-                       return call_user_func(array($object, $getterMethodName));
-               } elseif ($object instanceof ArrayAccess && isset($object[$propertyName])) {
-                       return $object[$propertyName];
-               } elseif (array_key_exists($propertyName, get_object_vars($object))) {
-                       return $object->$propertyName;
+               if (is_array($subject)) {
+                       if (array_key_exists($propertyName, $subject)) {
+                               return $subject[$propertyName];
+                       }
+               } else {
+                       if (is_callable(array($subject, 'get' . ucfirst($propertyName)))) {
+                               return call_user_func(array($subject, 'get' . ucfirst($propertyName)));
+                       } elseif (is_callable(array($subject, 'is' . ucfirst($propertyName)))) {
+                               return call_user_func(array($subject, 'is' . ucfirst($propertyName)));
+                       } elseif ($subject instanceof ArrayAccess && isset($subject[$propertyName])) {
+                               return $subject[$propertyName];
+                       } elseif (array_key_exists($propertyName, get_object_vars($subject))) {
+                               return $subject->$propertyName;
+                       }
                }
-               return NULL;
+
+               throw new RuntimeException('The property "' . $propertyName . '" on the subject was not accessible.', 1263391473);
        }
 
        /**
-        * Gets a property path from a given object.
+        * Gets a property path from a given object or array.
         * If propertyPath is "bla.blubb", then we first call getProperty($object, 'bla'),
         * and on the resulting object we call getProperty(..., 'blubb')
         *
-        * @param object $object
+        * @param mixed $subject Object or array to get the property path from
         * @param string $propertyPath
-        * @return object Value of the property
+        * @return mixed Value of the property
         */
-       static public function getPropertyPath($object, $propertyPath) {
+       static public function getPropertyPath($subject, $propertyPath) {
                $propertyPathSegments = explode('.', $propertyPath);
                foreach ($propertyPathSegments as $pathSegment) {
-                       $object = self::getProperty($object, $pathSegment);
-                       if ($object === NULL) return NULL;
+                       if (is_object($subject) && self::isPropertyGettable($subject, $pathSegment)) {
+                               $subject = self::getProperty($subject, $pathSegment);
+                       } elseif (is_array($subject) && array_key_exists($pathSegment, $subject)) {
+                               $subject = self::getProperty($subject, $pathSegment);
+                       } else {
+                               return NULL;
+                       }
                }
-               return $object;
+               return $subject;
        }
 
        /**
@@ -162,16 +177,19 @@ class Tx_Extbase_Reflection_ObjectAccess {
                }
                return $properties;
        }
-
+       
        /**
-        * Build the getter method name for a given property by capitalizing the
-        * first letter of the property, and prepending it with "get".
+        * Tells if the value of the specified property can be retrieved by this Object Accessor.
         *
-        * @param string $property Name of the property
-        * @return string Name of the getter method name
+        * @param object $object Object containting the property
+        * @param string $propertyName Name of the property to check
+        * @return boolean
         */
-       static protected function buildGetterMethodName($property) {
-               return 'get' . ucfirst($property);
+       static public function isPropertyGettable($object, $propertyName) {
+               if (!is_object($object)) throw new InvalidArgumentException('$object must be an object, ' . gettype($object). ' given.', 1259828921);
+               if (array_search($propertyName, array_keys(get_class_vars(get_class($object)))) !== FALSE) return TRUE;
+               if (is_callable(array($object, 'get' . ucfirst($propertyName)))) return TRUE;
+               return is_callable(array($object, 'is' . ucfirst($propertyName)));
        }
 
        /**