diff --git a/lib/Twig/Template.php b/lib/Twig/Template.php index a07862790c1..d4210cba48f 100644 --- a/lib/Twig/Template.php +++ b/lib/Twig/Template.php @@ -405,12 +405,20 @@ protected function getAttribute($object, $item, array $arguments = array(), $typ } $lcItem = strtolower($item); + $deunderscoreItem = str_replace('_', '', $lcItem); + $checkDecamelItem = $lcItem !== $deunderscoreItem; if (isset(self::$cache[$class]['methods'][$lcItem])) { $method = $item; } elseif (isset(self::$cache[$class]['methods']['get'.$lcItem])) { $method = 'get'.$item; } elseif (isset(self::$cache[$class]['methods']['is'.$lcItem])) { $method = 'is'.$item; + } elseif ($checkDecamelItem && isset(self::$cache[$class]['methods'][$deunderscoreItem])) { + $method = $deunderscoreItem; + } elseif ($checkDecamelItem && isset(self::$cache[$class]['methods']['get'.$deunderscoreItem])) { + $method = 'get'.$deunderscoreItem; + } elseif ($checkDecamelItem && isset(self::$cache[$class]['methods']['is'.$deunderscoreItem])) { + $method = 'is'.$deunderscoreItem; } elseif (isset(self::$cache[$class]['methods']['__call'])) { $method = $item; } else { diff --git a/test/Twig/Tests/TemplateTest.php b/test/Twig/Tests/TemplateTest.php index 448bdf89564..3513f8769e7 100644 --- a/test/Twig/Tests/TemplateTest.php +++ b/test/Twig/Tests/TemplateTest.php @@ -289,6 +289,15 @@ public function getGetAttributeTests() array(false, null, $methodAndPropObject, 'c', array(), $methodType), array(false, null, $methodAndPropObject, 'c', array(), $arrayType), + array(true, 'camelcase', $methodAndPropObject, 'camelcase', array(), $anyType), + array(true, 'camelcase', $methodAndPropObject, 'camelcase', array(), $methodType), + + array(true, 'camelcase', $methodAndPropObject, 'camelCase', array(), $anyType), + array(true, 'camelcase', $methodAndPropObject, 'camelCase', array(), $methodType), + + array(true, 'camelcase', $methodAndPropObject, 'camel_case', array(), $anyType), + array(true, 'camelcase', $methodAndPropObject, 'camel_case', array(), $methodType), + array(false, null, $methodAndPropObject, 'a', array(), $arrayType), )); // tests when input is not an array or object @@ -523,6 +532,12 @@ private function getC() { return 'c'; } + + private $camelCase = 'camelcase_prop'; + public function getCamelCase() + { + return 'camelcase'; + } } class Twig_TemplateMagicMethodObject