22
33namespace Remorhaz \JSONPointer \Pointer \Evaluate ;
44
5- use Remorhaz \JSONPointer \Locator \Reference ;
6-
75abstract class ReferenceEvaluate
86{
97
8+ /**
9+ * @var Advancer|null
10+ */
11+ protected $ advancer ;
12+
1013 protected $ result ;
1114
1215 protected $ isResultSet ;
1316
1417
15- /**
16- * Performs reference evaluation.
17- *
18- * @return $this
19- */
20- abstract public function perform ();
21-
22-
2318 /**
2419 * Constructor.
2520 */
@@ -39,25 +34,51 @@ public static function factory()
3934 }
4035
4136
42- public function isResultSet ()
37+ abstract protected function performNonExisting ();
38+
39+
40+ /**
41+ * @return Advancer
42+ */
43+ protected function getAdvancer ()
4344 {
44- return $ this ->isResultSet ;
45+ if (null === $ this ->advancer ) {
46+ throw new LogicException ("Advancer is not set in reference evaluator " );
47+ }
48+ return $ this ->advancer ;
49+ }
50+
51+
52+ public function setAdvancer (Advancer $ advancer )
53+ {
54+ $ this ->advancer = $ advancer ;
55+ return $ this ;
4556 }
4657
4758
4859 /**
49- * Sets evaluation result .
60+ * Performs reference evaluation .
5061 *
51- * @param mixed $result
5262 * @return $this
5363 */
54- protected function setResult (& $ result )
64+ public function perform ( )
5565 {
56- $ this ->result = &$ result ;
57- $ this ->isResultSet = true ;
58- return $ this ;
66+ $ canAdvance = $ this
67+ ->getAdvancer ()
68+ ->canAdvance ();
69+ if ($ canAdvance ) {
70+ $ this
71+ ->getAdvancer ()
72+ ->advance ();
73+ return $ this ;
74+ }
75+ return $ this ->performNonExisting ();
5976 }
6077
78+ public function isResultSet ()
79+ {
80+ return $ this ->isResultSet ;
81+ }
6182
6283 /**
6384 * Returns evaluation result.
@@ -72,4 +93,17 @@ public function &getResult()
7293 }
7394 return $ this ->result ;
7495 }
96+
97+ /**
98+ * Sets evaluation result.
99+ *
100+ * @param mixed $result
101+ * @return ReferenceEvaluate
102+ */
103+ protected function setResult (&$ result )
104+ {
105+ $ this ->result = &$ result ;
106+ $ this ->isResultSet = true ;
107+ return $ this ;
108+ }
75109}
0 commit comments