Skip to content
This repository has been archived by the owner on Jul 8, 2023. It is now read-only.

Commit

Permalink
Merge pull request #12 from jmalloc/master
Browse files Browse the repository at this point in the history
Implemented instanceBy and instanceByPredicate
  • Loading branch information
Erin Millard committed Jul 31, 2012
2 parents af7ee5e + f268136 commit 699bb38
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/Eloquent/Enumeration/Multiton.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,41 @@ public static final function instanceByKey($key)
throw new Exception\UndefinedInstanceException(get_called_class(), 'key', $key);
}

/**
* Returns a single member instance by comparison with the result of an accessor method.
*
* @param string $property The name of the property (accessor method) to match.
* @param mixed $value The value to match.
*
* @return Multiton The first member instance for which $instance->{$property}() === $value.
* @throws UndefinedInstanceException If no associated instance is found.
*/
public static final function instanceBy($property, $value) {
foreach (static::multitonInstances() as $instance) {
if ($instance->{$property}() === $value) {
return $instance;
}
}
throw new Exception\UndefinedInstanceException(get_called_class(), $property, $value);
}

/**
* Returns a single member instance by predicate callback.
*
* @param callback $predicate The predicate applies to the multiton instance to find a match.
*
* @return Multiton The first member instance for which $predicate($instance) evaluates to boolean true.
* @throws UndefinedInstanceException If no associated instance is found.
*/
public static final function instanceByPredicate($predicate) {
foreach (static::multitonInstances() as $instance) {
if ($predicate($instance)) {
return $instance;
}
}
throw new Exception\UndefinedInstanceException(get_called_class(), '<callback>', '<callback>');
}

/**
* Maps static method calls to member instances.
*
Expand Down
66 changes: 66 additions & 0 deletions test/suite/Eloquent/Enumeration/MultitonTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,72 @@ public function testInstanceByKeyFailureUndefined()
ValidMultiton::instanceByKey('DOOM');
}

public function testInstanceBy()
{
$this->assertSame(array(), ValidMultiton::calls());

$foo = ValidMultiton::instanceBy('key', 'FOO');
$bar = ValidMultiton::instanceBy('key', 'BAR');

$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $foo);
$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $bar);
$this->assertNotEquals($foo, $bar);
$this->assertSame($foo, ValidMultiton::instanceByKey('FOO'));
$this->assertSame($bar, ValidMultiton::instanceByKey('BAR'));

$this->assertSame(array(
array(
'Eloquent\Enumeration\Test\Fixture\ValidMultiton::initializeMultiton',
array(),
),
), ValidMultiton::calls());
}

public function testInstanceByFailureUndefined()
{
$this->setExpectedException('Eloquent\Enumeration\Exception\UndefinedInstanceException');
ValidMultiton::instanceBy('key', 'DOOM');
}

public function testInstanceByPredicate()
{
$this->assertSame(array(), ValidMultiton::calls());

$foo = ValidMultiton::instanceByPredicate(
function(ValidMultiton $instance) {
return $instance->key() === 'FOO';
}
);
$bar = ValidMultiton::instanceByPredicate(
function(ValidMultiton $instance) {
return $instance->key() === 'BAR';
}
);

$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $foo);
$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $bar);
$this->assertNotEquals($foo, $bar);
$this->assertSame($foo, ValidMultiton::instanceByKey('FOO'));
$this->assertSame($bar, ValidMultiton::instanceByKey('BAR'));

$this->assertSame(array(
array(
'Eloquent\Enumeration\Test\Fixture\ValidMultiton::initializeMultiton',
array(),
),
), ValidMultiton::calls());
}

public function testInstanceByPredicateFailureUndefined()
{
$this->setExpectedException('Eloquent\Enumeration\Exception\UndefinedInstanceException');
ValidMultiton::instanceByPredicate(
function(ValidMultiton $instance) {
return false;
}
);
}

public function testCallStatic()
{
$foo = ValidMultiton::FOO();
Expand Down

0 comments on commit 699bb38

Please sign in to comment.