From d9b3abf8ac5d72eb00a210a0d5397afa8271e070 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 8 Dec 2008 01:41:19 +0000 Subject: [PATCH] MINOR Documented ClassInfo::subclassesFor() and added unit tests git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@67689 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- core/ClassInfo.php | 26 +++++++++++++++++++++++--- tests/ClassInfoTest.php | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 tests/ClassInfoTest.php diff --git a/core/ClassInfo.php b/core/ClassInfo.php index b8be71c69..9651754e3 100755 --- a/core/ClassInfo.php +++ b/core/ClassInfo.php @@ -101,16 +101,36 @@ class ClassInfo { /** * Returns a list of classes that inherit from the given class. + * The resulting array includes the base class passed + * through the $class parameter as the first array value. + * + * Example usage: + * + * ClassInfo::subclassesFor('BaseClass'); + * array( + * 0 => 'BaseClass', + * 'ChildClass' => 'ChildClass', + * 'GrandChildClass' => 'GrandChildClass' + * ) + * * * @param mixed $class string of the classname or instance of the class - * @return array + * @return array Names of all subclasses as an associative array. */ static function subclassesFor($class){ global $_ALL_CLASSES; if (is_object($class)) $class = get_class($class); + + // get all classes from the manifest $subclasses = isset($_ALL_CLASSES['children'][$class]) ? $_ALL_CLASSES['children'][$class] : null; - if(isset($subclasses)) array_unshift($subclasses, $class); - else $subclasses[$class] = $class; + + // add the base class to the array + if(isset($subclasses)) { + array_unshift($subclasses, $class); + } else { + $subclasses[$class] = $class; + } + return $subclasses; } diff --git a/tests/ClassInfoTest.php b/tests/ClassInfoTest.php new file mode 100644 index 000000000..349858ce0 --- /dev/null +++ b/tests/ClassInfoTest.php @@ -0,0 +1,33 @@ +assertEquals( + ClassInfo::subclassesFor('ClassInfoTest_BaseClass'), + array( + 0 => 'ClassInfoTest_BaseClass', + 'ClassInfoTest_ChildClass' => 'ClassInfoTest_ChildClass', + 'ClassInfoTest_GrandChildClass' => 'ClassInfoTest_GrandChildClass' + ), + 'ClassInfo::subclassesFor() returns only direct subclasses and doesnt include base class' + ); + } + +} + +class ClassInfoTest_BaseClass { + +} + +class ClassInfoTest_ChildClass extends ClassInfoTest_BaseClass { + +} + +class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass { + +} +?> \ No newline at end of file