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

Commit 699bb38

Browse files
author
Erin Millard
committed
Merge pull request #12 from jmalloc/master
Implemented instanceBy and instanceByPredicate
2 parents af7ee5e + f268136 commit 699bb38

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

src/Eloquent/Enumeration/Multiton.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,41 @@ public static final function instanceByKey($key)
5050
throw new Exception\UndefinedInstanceException(get_called_class(), 'key', $key);
5151
}
5252

53+
/**
54+
* Returns a single member instance by comparison with the result of an accessor method.
55+
*
56+
* @param string $property The name of the property (accessor method) to match.
57+
* @param mixed $value The value to match.
58+
*
59+
* @return Multiton The first member instance for which $instance->{$property}() === $value.
60+
* @throws UndefinedInstanceException If no associated instance is found.
61+
*/
62+
public static final function instanceBy($property, $value) {
63+
foreach (static::multitonInstances() as $instance) {
64+
if ($instance->{$property}() === $value) {
65+
return $instance;
66+
}
67+
}
68+
throw new Exception\UndefinedInstanceException(get_called_class(), $property, $value);
69+
}
70+
71+
/**
72+
* Returns a single member instance by predicate callback.
73+
*
74+
* @param callback $predicate The predicate applies to the multiton instance to find a match.
75+
*
76+
* @return Multiton The first member instance for which $predicate($instance) evaluates to boolean true.
77+
* @throws UndefinedInstanceException If no associated instance is found.
78+
*/
79+
public static final function instanceByPredicate($predicate) {
80+
foreach (static::multitonInstances() as $instance) {
81+
if ($predicate($instance)) {
82+
return $instance;
83+
}
84+
}
85+
throw new Exception\UndefinedInstanceException(get_called_class(), '<callback>', '<callback>');
86+
}
87+
5388
/**
5489
* Maps static method calls to member instances.
5590
*

test/suite/Eloquent/Enumeration/MultitonTest.php

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,72 @@ public function testInstanceByKeyFailureUndefined()
6767
ValidMultiton::instanceByKey('DOOM');
6868
}
6969

70+
public function testInstanceBy()
71+
{
72+
$this->assertSame(array(), ValidMultiton::calls());
73+
74+
$foo = ValidMultiton::instanceBy('key', 'FOO');
75+
$bar = ValidMultiton::instanceBy('key', 'BAR');
76+
77+
$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $foo);
78+
$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $bar);
79+
$this->assertNotEquals($foo, $bar);
80+
$this->assertSame($foo, ValidMultiton::instanceByKey('FOO'));
81+
$this->assertSame($bar, ValidMultiton::instanceByKey('BAR'));
82+
83+
$this->assertSame(array(
84+
array(
85+
'Eloquent\Enumeration\Test\Fixture\ValidMultiton::initializeMultiton',
86+
array(),
87+
),
88+
), ValidMultiton::calls());
89+
}
90+
91+
public function testInstanceByFailureUndefined()
92+
{
93+
$this->setExpectedException('Eloquent\Enumeration\Exception\UndefinedInstanceException');
94+
ValidMultiton::instanceBy('key', 'DOOM');
95+
}
96+
97+
public function testInstanceByPredicate()
98+
{
99+
$this->assertSame(array(), ValidMultiton::calls());
100+
101+
$foo = ValidMultiton::instanceByPredicate(
102+
function(ValidMultiton $instance) {
103+
return $instance->key() === 'FOO';
104+
}
105+
);
106+
$bar = ValidMultiton::instanceByPredicate(
107+
function(ValidMultiton $instance) {
108+
return $instance->key() === 'BAR';
109+
}
110+
);
111+
112+
$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $foo);
113+
$this->assertInstanceOf('Eloquent\Enumeration\Test\Fixture\ValidMultiton', $bar);
114+
$this->assertNotEquals($foo, $bar);
115+
$this->assertSame($foo, ValidMultiton::instanceByKey('FOO'));
116+
$this->assertSame($bar, ValidMultiton::instanceByKey('BAR'));
117+
118+
$this->assertSame(array(
119+
array(
120+
'Eloquent\Enumeration\Test\Fixture\ValidMultiton::initializeMultiton',
121+
array(),
122+
),
123+
), ValidMultiton::calls());
124+
}
125+
126+
public function testInstanceByPredicateFailureUndefined()
127+
{
128+
$this->setExpectedException('Eloquent\Enumeration\Exception\UndefinedInstanceException');
129+
ValidMultiton::instanceByPredicate(
130+
function(ValidMultiton $instance) {
131+
return false;
132+
}
133+
);
134+
}
135+
70136
public function testCallStatic()
71137
{
72138
$foo = ValidMultiton::FOO();

0 commit comments

Comments
 (0)