API CHANGE: Refactored ClassInfo::baseDataClass() to use inbuilt PHP methods, and throw an exception if the passed class is not a subclass of DataObject.

This commit is contained in:
ajshort 2011-03-24 20:14:38 +11:00
parent d187718a3f
commit 0d03348926
2 changed files with 34 additions and 18 deletions

View File

@ -90,21 +90,26 @@ class ClassInfo {
} }
/** /**
* Return the root data class for that class. * Returns the root class (the first to extend from DataObject) for the
* This root table has a lot of special use in the DataObject system. * passed class.
* *
* @param mixed $class string of the classname or instance of the class * @param string|object $class
* @return array * @return string
*/ */
static function baseDataClass($class) { public static function baseDataClass($class) {
global $_ALL_CLASSES;
if (is_object($class)) $class = get_class($class); if (is_object($class)) $class = get_class($class);
reset($_ALL_CLASSES['parents'][$class]);
while($val = next($_ALL_CLASSES['parents'][$class])) { if (!self::is_subclass_of($class, 'DataObject')) {
if($val == 'DataObject') break; throw new Exception("$class is not a subclass of DataObject");
}
while ($next = get_parent_class($class)) {
if ($next == 'DataObject') {
return $class;
}
$class = $next;
} }
$baseDataClass = next($_ALL_CLASSES['parents'][$class]);
return $baseDataClass ? $baseDataClass : $class;
} }
/** /**

View File

@ -34,9 +34,21 @@ class ClassInfoTest extends SapphireTest {
// ); // );
} }
/**
* @covers ClassInfo::baseDataClass()
*/
public function testBaseDataClass() {
$this->assertEquals('ClassInfoTest_BaseClass', ClassInfo::baseDataClass('ClassInfoTest_BaseClass'));
$this->assertEquals('ClassInfoTest_BaseClass', ClassInfo::baseDataClass('ClassInfoTest_ChildClass'));
$this->assertEquals('ClassInfoTest_BaseClass', ClassInfo::baseDataClass('ClassInfoTest_GrandChildClass'));
$this->setExpectedException('Exception');
ClassInfo::baseDataClass('DataObject');
} }
class ClassInfoTest_BaseClass { }
class ClassInfoTest_BaseClass extends DataObject {
} }
@ -47,4 +59,3 @@ class ClassInfoTest_ChildClass extends ClassInfoTest_BaseClass {
class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass { class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass {
} }
?>