| 
<?phpnamespace JmesPath;
 
 /**
 * Uses an external tree visitor to interpret an AST.
 */
 class AstRuntime
 {
 private $parser;
 private $interpreter;
 private $cache = [];
 private $cachedCount = 0;
 
 public function __construct(
 Parser $parser = null,
 callable $fnDispatcher = null
 ) {
 $fnDispatcher = $fnDispatcher ?: FnDispatcher::getInstance();
 $this->interpreter = new TreeInterpreter($fnDispatcher);
 $this->parser = $parser ?: new Parser();
 }
 
 /**
 * Returns data from the provided input that matches a given JMESPath
 * expression.
 *
 * @param string $expression JMESPath expression to evaluate
 * @param mixed  $data       Data to search. This data should be data that
 *                           is similar to data returned from json_decode
 *                           using associative arrays rather than objects.
 *
 * @return mixed|null Returns the matching data or null
 */
 public function __invoke($expression, $data)
 {
 if (!isset($this->cache[$expression])) {
 // Clear the AST cache when it hits 1024 entries
 if (++$this->cachedCount > 1024) {
 $this->cache = [];
 $this->cachedCount = 0;
 }
 $this->cache[$expression] = $this->parser->parse($expression);
 }
 
 return $this->interpreter->visit($this->cache[$expression], $data);
 }
 }
 
 |