diff --git a/Cake/ORM/BehaviorRegistry.php b/Cake/ORM/BehaviorRegistry.php new file mode 100644 index 00000000000..dfb81bf90b3 --- /dev/null +++ b/Cake/ORM/BehaviorRegistry.php @@ -0,0 +1,103 @@ +_table = $table; + $this->_eventManager = $table->getEventManager(); + } + +/** + * Resolve a behavior classname. + * + * Part of the template method for Cake\Utility\ObjectRegistry::load() + * + * @param string $class Partial classname to resolve. + * @return string|false Either the correct classname or false. + */ + protected function _resolveClassName($class) { + return App::classname($class, 'Model/Behavior', 'Behavior'); + } + +/** + * Throws an exception when a behavior is missing. + * + * Part of the template method for Cake\Utility\ObjectRegistry::load() + * + * @param string $class The classname that is missing. + * @param string $plugin The plugin the behavior is missing in. + * @throws Cake\Error\MissingBehaviorException + */ + protected function _throwMissingClassError($class, $plugin) { + throw new Error\MissingBehaviorException([ + 'class' => $class, + 'plugin' => $plugin + ]); + } + +/** + * Create the behavior instance. + * + * Part of the template method for Cake\Utility\ObjectRegistry::load() + * Enabled behaviors will be registered with the event manager. + * + * @param string $class The classname that is missing. + * @param array $settings An array of settings to use for the behavior. + * @return Component The constructed behavior class. + */ + protected function _create($class, $settings) { + $instance = new $class($this->_table, $settings); + $enable = isset($settings['enabled']) ? $settings['enabled'] : true; + if ($enable) { + $this->_eventManager->attach($instance); + } + return $instance; + } + +} diff --git a/Cake/Test/TestCase/ORM/BehaviorRegistryTest.php b/Cake/Test/TestCase/ORM/BehaviorRegistryTest.php new file mode 100644 index 00000000000..1ce70d4014f --- /dev/null +++ b/Cake/Test/TestCase/ORM/BehaviorRegistryTest.php @@ -0,0 +1,116 @@ +Table = new Table(['table' => 'articles']); + $this->EventManager = $this->Table->getEventManager(); + $this->Behaviors = new BehaviorRegistry($this->Table); + } + +/** + * tearDown + * + * @return void + */ + public function tearDown() { + Plugin::unload(); + unset($this->Table, $this->EventManager, $this->Behaviors); + parent::tearDown(); + } + +/** + * Test loading app & core behaviors. + * + * @return void + */ + public function testLoad() { + $this->markTestIncomplete('not done'); + } + +/** + * Test load() binding listeners. + * + * @return void + */ + public function testLoadBindEvents() { + $this->markTestIncomplete('not done'); + } + +/** + * Test load() with enabled = false + * + * @return void + */ + public function testLoadEnabledFalse() { + $this->markTestIncomplete('not done'); + } + +/** + * Test loading plugin behaviors + * + * @return void + */ + public function testLoadPlugin() { + $this->markTestIncomplete('not done'); + } + +/** + * Test load() on undefined class + * + * @expectedException Cake\Error\MissingBehaviorException + * @return void + */ + public function testLoadMissingClass() { + $this->markTestIncomplete('not done'); + } + +/** + * Test load() duplicate method error + * + * @expectedException Cake\Error\Exception + * @expectedExceptionMessage TestApp\Model\Behavior\DuplicateBehavior contains duplicate method "dupe" + * @return void + */ + public function testLoadDuplicateMethodError() { + $this->markTestIncomplete('not done'); + } + +/** + * test hasMethod() + * + * @return void + */ + public function testHasMethod() { + $this->markTestIncomplete('not done'); + } + +}