docs: def path_shift(self, count=1):
          ''' Shift some levels of PATH_INFO into SCRIPT_NAME and return the
              moved part. count defaults to 1'''
          #/a/b/  /c/d  --> 'a','b'  'c','d'
          if count == 0: return ''
          pathlist = self.path.strip('/').split('/')
          scriptlist = self.environ.get('SCRIPT_NAME','/').strip('/').split('/')
          if pathlist and pathlist[0] == '': pathlist = []
          if scriptlist and scriptlist[0] == '': scriptlist = []
          if count > 0 and count <= len(pathlist):
              moved = pathlist[:count]
              scriptlist = scriptlist + moved
              pathlist = pathlist[count:]
          elif count < 0 and count >= -len(scriptlist):
              moved = scriptlist[count:]
              pathlist = moved + pathlist
              scriptlist = scriptlist[:count]
          else:
              empty = 'SCRIPT_NAME' if count < 0 else 'PATH_INFO'
              raise AssertionError("Cannot shift. Nothing left from %s" % empty)
          self['PATH_INFO'] = self.path =  '/' + '/'.join(pathlist) \
                            + ('/' if self.path.endswith('/') and pathlist else '')
          self['SCRIPT_NAME'] = '/' + '/'.join(scriptlist)
          return '/'.join(moved)