From debe8ba2a32727616300f00c8ebe1217911fec68 Mon Sep 17 00:00:00 2001 From: Simon Erkelens Date: Mon, 14 Mar 2016 12:28:45 +1300 Subject: [PATCH] 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. --- core/Object.php | 2 ++ tests/model/DataExtensionTest.php | 25 +++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/core/Object.php b/core/Object.php index 56ee9cac4..4f3f990b1 100755 --- a/core/Object.php +++ b/core/Object.php @@ -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])) { diff --git a/tests/model/DataExtensionTest.php b/tests/model/DataExtensionTest.php index a2a8ccfda..8b8fb5c3a 100644 --- a/tests/model/DataExtensionTest.php +++ b/tests/model/DataExtensionTest.php @@ -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