docs: def invalidate(self):
          """Invalidate cached data for this page."""
  
          cache.delete(self.PAGE_LANGUAGES_KEY % (self.pk))
          cache.delete('PAGE_FIRST_ROOT_ID')
          cache.delete(self.CHILDREN_KEY % self.pk)
          cache.delete(self.PUB_CHILDREN_KEY % self.pk)
          # XXX: Should this have a depth limit?
          if self.parent_id:
              self.parent.invalidate()
          self._languages = None
          self._complete_slug = None
          self._content_dict = dict()
  
          placeholders = get_placeholders(self.get_template())
  
          p_names = [p.ctype for p in placeholders]
          if 'slug' not in p_names:
              p_names.append('slug')
          if 'title' not in p_names:
              p_names.append('title')
  
          from pages.managers import fake_page
          shared = [p for p in placeholders if p.shared]
          for share in shared:
              fake_page.invalidate(share.ctype)
  
          # delete content cache, frozen or not
          for name in p_names:
              # frozen
              cache.delete(
                  PAGE_CONTENT_DICT_KEY %
                  (self.pk, name, 1))
              # not frozen
              cache.delete(
                  PAGE_CONTENT_DICT_KEY %
                  (self.pk, name, 0))
  
          cache.delete(self.PAGE_URL_KEY % (self.pk))