Skip to content

Commit e50e18d

Browse files
committed
Reference evaluator factories implemented
1 parent 699cb70 commit e50e18d

File tree

9 files changed

+393
-196
lines changed

9 files changed

+393
-196
lines changed

src/Pointer/Evaluate/LocatorEvaluate.php

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,16 @@ abstract class LocatorEvaluate
5555
*/
5656
protected $result;
5757

58-
protected $nonNumericIndices = false;
59-
6058
/**
6159
* @var ReferenceEvaluate|null
6260
*/
6361
protected $referenceEvaluate;
6462

63+
/**
64+
* @var ReferenceEvaluateFactory|null
65+
*/
66+
protected $referenceEvaluateFactory;
67+
6568

6669
/**
6770
* Constructor.
@@ -183,14 +186,18 @@ public function &getResult()
183186

184187
public function allowNonNumericIndices()
185188
{
186-
$this->nonNumericIndices = true;
189+
$this
190+
->getReferenceEvaluateFactory()
191+
->allowNonNumericIndices();
187192
return $this;
188193
}
189194

190195

191196
public function forbidNonNumericIndices()
192197
{
193-
$this->nonNumericIndices = false;
198+
$this
199+
->getReferenceEvaluateFactory()
200+
->forbidNonNumericIndices();
194201
return $this;
195202
}
196203

@@ -222,70 +229,51 @@ public function perform()
222229

223230

224231
/**
225-
* @param Reference $reference
226-
* @return ReferenceEvaluate
232+
* @return ReferenceEvaluateFactory
227233
*/
228-
protected function createReferenceEvaluate(Reference $reference)
229-
{
230-
if (is_object($this->dataCursor)) {
231-
return $this->createReferenceEvaluateProperty($reference);
232-
}
233-
if (is_array($this->dataCursor)) {
234-
return $this->createReferenceEvaluateIndex($reference);
235-
}
236-
return $this->createReferenceEvaluateScalar($reference);
237-
}
238-
239-
240-
abstract protected function createReferenceEvaluateProperty(Reference $reference);
234+
abstract protected function createReferenceEvaluateFactory();
241235

242236

243-
protected function createReferenceEvaluateIndex(Reference $reference)
237+
/**
238+
* @return ReferenceEvaluateFactory
239+
*/
240+
protected function getReferenceEvaluateFactory()
244241
{
245-
switch ($reference->getType()) {
246-
case $reference::TYPE_NEXT_INDEX:
247-
return $this->createReferenceEvaluateNextIndex($reference);
248-
249-
case $reference::TYPE_INDEX:
250-
return $this->createReferenceEvaluateNumericIndex($reference);
251-
252-
case $reference::TYPE_PROPERTY:
253-
return $this->createReferenceEvaluateNonNumericIndex($reference);
242+
if (null === $this->referenceEvaluateFactory) {
243+
$this->referenceEvaluateFactory = $this->createReferenceEvaluateFactory();
254244
}
255-
return $this->createReferenceEvaluateUnknownIndex($reference);
245+
return $this->referenceEvaluateFactory;
256246
}
257247

258248

259-
abstract protected function createReferenceEvaluateNextIndex(Reference $reference);
260-
261-
262-
abstract protected function createReferenceEvaluateNumericIndex(Reference $reference);
263-
264-
265-
protected function createReferenceEvaluateNonNumericIndex(Reference $reference)
249+
protected function setupReferenceEvaluateFactory(Reference $reference)
266250
{
267-
return $this->nonNumericIndices
268-
? $this->createReferenceEvaluateAllowedNonNumericIndex($reference)
269-
: $this->createReferenceEvaluateNotAllowedNonNumericIndex($reference);
251+
$this
252+
->getReferenceEvaluateFactory()
253+
->setReference($reference)
254+
->setDataCursor($this->dataCursor);
255+
return $this;
270256
}
271257

272258

273-
abstract protected function createReferenceEvaluateAllowedNonNumericIndex(Reference $reference);
274-
275-
276-
abstract protected function createReferenceEvaluateNotAllowedNonNumericIndex(Reference $reference);
277-
278-
279-
abstract protected function createReferenceEvaluateUnknownIndex(Reference $reference);
280-
281-
282-
abstract protected function createReferenceEvaluateScalar(Reference $reference);
259+
/**
260+
* @param Reference $reference
261+
* @return ReferenceEvaluate
262+
*/
263+
protected function createReferenceEvaluate(Reference $reference)
264+
{
265+
return $this
266+
->setupReferenceEvaluateFactory($reference)
267+
->getReferenceEvaluateFactory()
268+
->createReferenceEvaluate();
269+
}
283270

284271

285272
protected function setupReferenceEvaluate(Reference $reference)
286273
{
287274
$this->referenceEvaluate = $this
288275
->createReferenceEvaluate($reference)
276+
->setReference($reference)
289277
->setDataCursor($this->dataCursor);
290278
return $this;
291279
}

src/Pointer/Evaluate/LocatorRead.php

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,52 +13,9 @@ protected function processCursor()
1313
return $this->setResult($this->dataCursor);
1414
}
1515

16-
17-
protected function createReferenceEvaluateProperty(Reference $reference)
18-
{
19-
return ReferenceReadProperty::factory()
20-
->setReference($reference);
21-
}
22-
23-
24-
protected function createReferenceEvaluateNextIndex(Reference $reference)
25-
{
26-
return ReferenceReadNextIndex::factory()
27-
->setReference($reference);
28-
}
29-
30-
31-
protected function createReferenceEvaluateNumericIndex(Reference $reference)
32-
{
33-
return ReferenceReadNumericIndex::factory()
34-
->setReference($reference);
35-
}
36-
37-
38-
protected function createReferenceEvaluateAllowedNonNumericIndex(Reference $reference)
39-
{
40-
return ReferenceReadAllowedNonNumericIndex::factory()
41-
->setReference($reference);
42-
}
43-
44-
45-
protected function createReferenceEvaluateNotAllowedNonNumericIndex(Reference $reference)
46-
{
47-
return ReferenceReadNotAllowedNonNumericIndex::factory()
48-
->setReference($reference);
49-
}
50-
51-
52-
protected function createReferenceEvaluateUnknownIndex(Reference $reference)
53-
{
54-
throw new DomainException(
55-
"Failed to create array read evaluator for reference of type {$reference->getType()}"
56-
);
57-
}
58-
59-
60-
protected function createReferenceEvaluateScalar(Reference $reference)
16+
17+
protected function createReferenceEvaluateFactory()
6118
{
62-
throw new EvaluateException("Cannot read non-structured data by reference '{$reference->getText()}'");
19+
return ReferenceReadFactory::factory();
6320
}
6421
}

src/Pointer/Evaluate/LocatorTest.php

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,51 +15,8 @@ protected function processCursor()
1515
}
1616

1717

18-
protected function createReferenceEvaluateProperty(Reference $reference)
18+
protected function createReferenceEvaluateFactory()
1919
{
20-
return ReferenceTestProperty::factory()
21-
->setReference($reference);
22-
}
23-
24-
25-
protected function createReferenceEvaluateNextIndex(Reference $reference)
26-
{
27-
return ReferenceTestNextIndex::factory()
28-
->setReference($reference);
29-
}
30-
31-
32-
protected function createReferenceEvaluateNumericIndex(Reference $reference)
33-
{
34-
return ReferenceTestNumericIndex::factory()
35-
->setReference($reference);
36-
}
37-
38-
39-
protected function createReferenceEvaluateAllowedNonNumericIndex(Reference $reference)
40-
{
41-
return ReferenceTestAllowedNonNumericIndex::factory()
42-
->setReference($reference);
43-
}
44-
45-
46-
protected function createReferenceEvaluateNotAllowedNonNumericIndex(Reference $reference)
47-
{
48-
return ReferenceTestNotAllowedNonNumericIndex::factory()
49-
->setReference($reference);
50-
}
51-
52-
53-
protected function createReferenceEvaluateUnknownIndex(Reference $reference)
54-
{
55-
throw new DomainException(
56-
"Failed to create array test evaluator for reference of type {$reference->getType()}"
57-
);
58-
}
59-
60-
61-
protected function createReferenceEvaluateScalar(Reference $reference)
62-
{
63-
throw new EvaluateException("Cannot test non-structured data by reference '{$reference->getText()}'");
20+
return ReferenceTestFactory::factory();
6421
}
6522
}

src/Pointer/Evaluate/LocatorWrite.php

Lines changed: 16 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,22 @@ protected function getValue()
3636

3737
public function allowNumericIndexGaps()
3838
{
39-
$this->numericIndexGaps = true;
39+
$factory = $this
40+
->getReferenceEvaluateFactory();
41+
if ($factory instanceof ReferenceWriteFactory) {
42+
$factory->allowNumericIndexGaps();
43+
}
4044
return $this;
4145
}
4246

4347

4448
public function forbidNumericIndexGaps()
4549
{
46-
$this->numericIndexGaps = false;
50+
$factory = $this
51+
->getReferenceEvaluateFactory();
52+
if ($factory instanceof ReferenceWriteFactory) {
53+
$factory->forbidNumericIndexGaps();
54+
}
4755
return $this;
4856
}
4957

@@ -56,6 +64,12 @@ protected function processCursor()
5664
}
5765

5866

67+
protected function createReferenceEvaluateFactory()
68+
{
69+
return ReferenceWriteFactory::factory();
70+
}
71+
72+
5973
protected function setupReferenceEvaluate(Reference $reference)
6074
{
6175
$referenceEvaluate = parent::setupReferenceEvaluate($reference)
@@ -65,56 +79,4 @@ protected function setupReferenceEvaluate(Reference $reference)
6579
}
6680
return $this;
6781
}
68-
69-
70-
protected function createReferenceEvaluateProperty(Reference $reference)
71-
{
72-
return ReferenceWriteProperty::factory()
73-
->setReference($reference);
74-
}
75-
76-
77-
protected function createReferenceEvaluateNextIndex(Reference $reference)
78-
{
79-
return ReferenceWriteNextIndex::factory()
80-
->setReference($reference);
81-
}
82-
83-
84-
protected function createReferenceEvaluateNumericIndex(Reference $reference)
85-
{
86-
return $this->numericIndexGaps
87-
? ReferenceWriteNumericIndexWithGaps::factory()
88-
->setReference($reference)
89-
: ReferenceWriteNumericIndexWithoutGaps::factory()
90-
->setReference($reference);
91-
}
92-
93-
94-
protected function createReferenceEvaluateAllowedNonNumericIndex(Reference $reference)
95-
{
96-
return ReferenceWriteAllowedNonNumericIndex::factory()
97-
->setReference($reference);
98-
}
99-
100-
101-
protected function createReferenceEvaluateNotAllowedNonNumericIndex(Reference $reference)
102-
{
103-
return ReferenceWriteNotAllowedNonNumericIndex::factory()
104-
->setReference($reference);
105-
}
106-
107-
108-
protected function createReferenceEvaluateUnknownIndex(Reference $reference)
109-
{
110-
throw new DomainException(
111-
"Failed to create array write evaluator for reference of type {$reference->getType()}"
112-
);
113-
}
114-
115-
116-
protected function createReferenceEvaluateScalar(Reference $reference)
117-
{
118-
throw new EvaluateException("Cannot write non-structured data by reference '{$reference->getText()}'");
119-
}
12082
}

0 commit comments

Comments
 (0)