Skip to content

Commit

Permalink
Start skeleton of BehaviorRegistry and its test case.
Browse files Browse the repository at this point in the history
BehaviorRegistry will be the replacement for BehaviorCollection in 3.0,
and follow the same pattern as HelperRegistry and ComponentRegistry.
  • Loading branch information
markstory committed Oct 22, 2013
1 parent df99d0c commit 862a90c
Show file tree
Hide file tree
Showing 2 changed files with 219 additions and 0 deletions.
103 changes: 103 additions & 0 deletions Cake/ORM/BehaviorRegistry.php
@@ -0,0 +1,103 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since CakePHP(tm) v 3.0.0
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
namespace Cake\ORM;

use Cake\Core\App;
use Cake\Error;
use Cake\ORM\Table;
use Cake\Utility\ObjectRegistry;

/**
* BehaviorRegistry is used as a registry for loaded behaviors and handles loading
* and constructing behavior objects.
*
* This class also provides method for checking and dispatching behavior methods.
*/
class BehaviorRegistry extends ObjectRegistry {

/**
* The table using this registry.
*
* @var Cake\ORM\Table
*/
protected $_table;

/**
* EventManager instance.
*
* Behaviors constructed by this object will be subscribed to this manager.
*
* @var Cake\Event\EventManager
*/
protected $_eventManager;

/**
* Constructor
*
* @param Cake\ORM\Table $table
*/
public function __construct(Table $table) {
$this->_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;
}

}
116 changes: 116 additions & 0 deletions Cake/Test/TestCase/ORM/BehaviorRegistryTest.php
@@ -0,0 +1,116 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since CakePHP(tm) v 3.0.0
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
namespace Cake\Test\TestCase\ORM;

use Cake\Core\Plugin;
use Cake\ORM\Table;
use Cake\ORM\BehaviorRegistry;
use Cake\TestSuite\TestCase;

/**
* Test case for BehaviorRegistry.
*/
class BehaviorRegistryTest extends TestCase {

/**
* setup method.
*
* @return void
*/
public function setUp() {
parent::setUp();
$this->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');
}

}

0 comments on commit 862a90c

Please sign in to comment.