public static function check($requester, $controlled, $privileges) {
		$self = static::_object();
		$aro = $self->_classes['aro'];
		$aco = $self->_classes['aco'];

		if (!(
			($aroNodes = $aro::node($requester, false)) &&
			($acoNodes = $aco::node($controlled, false))
		)) {
			return false;
		}

		$inherited = [];
		$required = (array) $privileges;
		$count = count($required);
		$aro_id = key(static::relations('Aro')->key());
		$aco_id = key(static::relations('Aco')->key());
		$ids = Set::extract($acoNodes, '/'.$aco::meta('key'));
		$left = $aco::actsAs('Tree', true, 'left');

		foreach ($aroNodes as $node) {
			$id = $node[$aro::meta('key')];
			if ($datas = static::_permQuery($id, $ids, $aro_id, $aco_id, $left)) {
				foreach ($datas as $data) {
					if (!$privileges = json_decode($data['privileges'], true)) {
						break;
					}
					foreach ($required as $key) {
						if (isset($privileges[$key])) {
							if(!$privileges[$key]) {
								$self->_error = ['message' => $self->_forbid];
								return false;
							} else {
								$inherited[$key] = 1;
							}
						}
					}
					if (count($inherited) === $count) {
						$self->_error = [];
						return true;
					}
				}
			}
		}
		$self->_error = ['message' => $self->_forbid];
		return false;
	}