function check_scope_criteria($criteria)
{
$stack = array();
foreach ($criteria as $crit) {
if (is_array($crit)) {
$value = false;
switch ($crit[0]) {
case 'request':
$value = URL::get_matched_rule()->name == $crit[1];
break;
case 'token':
if (isset($crit[2])) {
$value = User::identify()->can($crit[1], $crit[2]);
} else {
$value = User::identify()->can($crit[1]);
}
break;
default:
$value = Plugins::filter('scope_criteria_value', $value, $crit[1], $crit[2]);
break;
}
$stack[] = $value;
} else {
switch ($crit) {
case 'not':
$stack[] = !array_pop($stack);
break;
case 'or':
$value1 = array_pop($stack);
$value2 = array_pop($stack);
$stack[] = $value1 || $value2;
break;
case 'and':
$value1 = array_pop($stack);
$value2 = array_pop($stack);
$stack[] = $value1 && $value2;
break;
default:
Plugins::act('scope_criteria_operator', $stack, $crit);
break;
}
}
}
return array_pop($stack);
}