public function applyFlags($criteria, $flags, $operator = 'AND')
    {
        $flagList = $this->cachedFlags();

        $flags = CPropertyValue::ensureArray($flags);

        $newCriteria = new CDbCriteria();
        foreach ($flags as $flag) {
            if (is_string($flag)) {
                if ($invert = ($flag[0] == '!')) {
                    $flag = substr($flag, 1);
                }
                $flagValue = $flagList[trim(strtolower($flag))];
            } else {
                $flagValue = $flag;
            }
            if (empty($flagValue) === false) {
                $equality = $invert ? '=' : '<>';
                $newCriteria->addCondition($this->flagsField . '&' . $flagValue . $equality . '0', $operator);
            }
        }
        $criteria->mergeWith($newCriteria);
        return $criteria;
    }