/**
  * @param  SS_HTTPRequest  $request
  * @param  SS_HTTPResponse $response
  * @return bool
  */
 protected function allowSave(SS_HTTPRequest $request, SS_HTTPResponse $response)
 {
     $vars = array('request' => $request, 'response' => $response, 'member' => \Member::currentUser(), 'session' => \Session::get_all()) + $this->extraExpressionVars;
     if (count($this->saveExcludeRules)) {
         foreach ($this->saveExcludeRules as $rule) {
             if ($this->expressionLanguage->evaluate($rule, $vars)) {
                 return false;
             }
         }
     }
     if (count($this->saveIncludeRules)) {
         foreach ($this->saveIncludeRules as $rule) {
             if (!$this->expressionLanguage->evaluate($rule, $vars)) {
                 return false;
             }
         }
     }
     return true;
 }
 /**
  * @param $action
  */
 protected function onChange($action)
 {
     $vars = array('item' => $this->owner, 'action' => $action);
     $logger = $this->cache->getLogger();
     // TODO: A bit complex. Needs refactor
     foreach ($this->cache->getConfig() as $name => $inst) {
         $hasContainsRules = isset($inst['contains']) && is_array($inst['contains']);
         $hasInvalidationRules = isset($inst['invalidation_rules']) && is_array($inst['invalidation_rules']);
         // Check to see if there are contains rules, and if there is
         // we want to ensure that the invalidation rules are only processed
         // if the class at least passes the invalidation rules
         if ($hasContainsRules) {
             $contains = false;
             foreach ($inst['contains'] as $contain) {
                 if ($this->owner instanceof $contain) {
                     $contains = $contain;
                     break;
                 }
             }
             // We don't want to do any more processing if the contains
             // rules didn't even pass
             if (!$contains) {
                 continue;
             }
         } else {
             $contains = true;
         }
         if ($hasInvalidationRules) {
             foreach ($inst['invalidation_rules'] as $rule) {
                 if ($this->expressionLanguage->evaluate($rule, $vars) && $contains) {
                     $this->invalidate($name, sprintf("Cache name '%s' invalidated by rule '%s'", $name, $rule), $logger);
                     break;
                 }
             }
         } elseif ($hasContainsRules && $contains) {
             // If there aren't any invalidation rules then invalidate the cache
             // simply based on the contains rules passing
             $this->invalidate($name, sprintf("Cache name '%s' invalidated as it contains '%s'", $name, $contains), $logger);
         }
     }
 }