Improvement: Set the owner on an extension, before getting all the available method names.

This enhances the extensions to enable certain features like adding wrapper methods instead of having to have them on the object itself.
This commit is contained in:
Simon Erkelens 2016-03-14 12:28:45 +13:00
parent ce560e7b76
commit debe8ba2a3
2 changed files with 25 additions and 2 deletions

View File

@ -816,7 +816,9 @@ abstract class Object {
}
if(method_exists($extension, 'allMethodNames')) {
if ($extension instanceof Extension) $extension->setOwner($this);
$methods = $extension->allMethodNames(true);
if ($extension instanceof Extension) $extension->clearOwner();
} else {
if(!isset(self::$built_in_methods[$extension->class])) {

View File

@ -166,6 +166,13 @@ class DataExtensionTest extends SapphireTest {
$this->assertEquals("hello world", $do->testMethodApplied());
}
public function testExtensionAllMethodNamesHasOwner() {
/** @var DataExtensionTest_MyObject $do */
$do = DataExtensionTest_MyObject::create();
$this->assertTrue($do->hasMethod('getTestValueWithDataExtensionTest_MyObject'));
}
public function testPageFieldGeneration() {
$page = new DataExtensionTest_CMSFieldsBase();
$fields = $page->getCMSFields();
@ -365,17 +372,31 @@ class DataExtensionTest_Faves extends DataExtension implements TestOnly {
}
class DataExtensionTest_AppliedToDO extends DataExtension implements TestOnly {
class DataExtensionTest_AppliedToDO extends DataExtension implements TestOnly
{
public function testMethodApplied() {
public function testMethodApplied()
{
return "hello world";
}
}
class DataExtensionTest_AllMethodNames extends DataExtension implements TestOnly
{
public function allMethodNames()
{
return array(
strtolower('getTestValueWith'.$this->owner->ClassName)
);
}
}
DataExtensionTest_MyObject::add_extension('DataExtensionTest_Ext1');
DataExtensionTest_MyObject::add_extension('DataExtensionTest_Ext2');
DataExtensionTest_MyObject::add_extension('DataExtensionTest_Faves');
DataExtensionTest_MyObject::add_extension('DataExtensionTest_AllMethodNames');
/**
* Base class for CMS fields