public function matches($className, $methodName, $methodDeclaringClassName, $pointcutQueryIdentifier)
{
$this->runtimeEvaluationsDefinition = [];
$matches = true;
foreach ($this->filters as &$operatorAndFilter) {
list($operator, $filter) = $operatorAndFilter;
$currentFilterMatches = $filter->matches($className, $methodName, $methodDeclaringClassName, $pointcutQueryIdentifier);
$currentRuntimeEvaluationsDefinition = $filter->getRuntimeEvaluationsDefinition();
switch ($operator) {
case '&&':
if ($currentFilterMatches === true && $filter->hasRuntimeEvaluationsDefinition()) {
if (!isset($this->runtimeEvaluationsDefinition[$operator])) {
$this->runtimeEvaluationsDefinition[$operator] = [];
}
$this->runtimeEvaluationsDefinition[$operator] = array_merge_recursive($this->runtimeEvaluationsDefinition[$operator], $currentRuntimeEvaluationsDefinition);
}
if ($this->earlyReturn && !$currentFilterMatches) {
return false;
}
$matches = $matches && $currentFilterMatches;
break;
case '&&!':
if ($currentFilterMatches === true && $filter->hasRuntimeEvaluationsDefinition()) {
if (!isset($this->runtimeEvaluationsDefinition[$operator])) {
$this->runtimeEvaluationsDefinition[$operator] = [];
}
$this->runtimeEvaluationsDefinition[$operator] = array_merge_recursive($this->runtimeEvaluationsDefinition[$operator], $currentRuntimeEvaluationsDefinition);
$currentFilterMatches = false;
}
if ($this->earlyReturn && $currentFilterMatches) {
return false;
}
$matches = $matches && !$currentFilterMatches;
break;
case '||':
if ($currentFilterMatches === true && $filter->hasRuntimeEvaluationsDefinition()) {
if (!isset($this->runtimeEvaluationsDefinition[$operator])) {
$this->runtimeEvaluationsDefinition[$operator] = [];
}
$this->runtimeEvaluationsDefinition[$operator] = array_merge_recursive($this->runtimeEvaluationsDefinition[$operator], $currentRuntimeEvaluationsDefinition);
}
$matches = $matches || $currentFilterMatches;
break;
case '||!':
if ($currentFilterMatches === true && $filter->hasRuntimeEvaluationsDefinition()) {
if (!isset($this->runtimeEvaluationsDefinition[$operator])) {
$this->runtimeEvaluationsDefinition[$operator] = [];
}
$this->runtimeEvaluationsDefinition[$operator] = array_merge_recursive($this->runtimeEvaluationsDefinition[$operator], $currentRuntimeEvaluationsDefinition);
$currentFilterMatches = false;
}
$matches = $matches || !$currentFilterMatches;
break;
}
}
return $matches;
}