Implement callable initializer for "connections" client option.

This commit is contained in:
Daniele Alessandri
2012-12-15 17:12:37 +01:00
parent 59813cd74e
commit ff5e3515c3
2 changed files with 35 additions and 2 deletions
+14 -2
View File
@@ -40,8 +40,20 @@ class ClientConnectionFactory extends AbstractOption
return $factory;
}
if (is_string($value) && class_exists($value)) {
if (!($factory = new $value()) && !$factory instanceof ConnectionFactoryInterface) {
if (is_callable($value)) {
$factory = call_user_func($value, $options, $this);
if (!$factory instanceof ConnectionFactoryInterface) {
throw new \InvalidArgumentException('Instance of Predis\Connection\ConnectionFactoryInterface expected');
}
return $factory;
}
if (@class_exists($value)) {
$factory = new $value();
if (!$factory instanceof ConnectionFactoryInterface) {
throw new \InvalidArgumentException("Class $value must be an instance of Predis\Connection\ConnectionFactoryInterface");
}
@@ -61,6 +61,27 @@ class ClientConnectionFactoryTest extends StandardTestCase
$this->assertSame($value, $option->filter($options, $value));
}
/**
* @group disconnected
*/
public function testValidationAcceptsCallableObjectAsInitializers()
{
$value = $this->getMock('Predis\Connection\ConnectionFactoryInterface');
$options = $this->getMock('Predis\Option\ClientOptionsInterface');
$option = new ClientConnectionFactory();
$initializer = $this->getMock('stdClass', array('__invoke'));
$initializer->expects($this->once())
->method('__invoke')
->with($this->isInstanceOf('Predis\Option\ClientOptionsInterface'), $option)
->will($this->returnValue($value));
$cluster = $option->filter($options, $initializer, $option);
$this->assertInstanceOf('Predis\Connection\ConnectionFactoryInterface', $cluster);
$this->assertSame($value, $cluster);
}
/**
* @group disconnected
*/