docs: def make_path_qs(self, items):
          '''Returns a relative path complete with query string for the given
          dictionary of items.
  
          Any items with keys matching this rule's url pattern will be inserted
          into the path. Any remaining items will be appended as query string
          parameters.
  
          All items will be urlencoded. Any items which are not instances of
          basestring, or int/long will be pickled before being urlencoded.
  
          .. warning:: The pickling of items only works for key/value pairs which
                       will be in the query string. This behavior should only be
                       used for the simplest of python objects. It causes the
                       URL to get very lengthy (and unreadable) and XBMC has a
                       hard limit on URL length. See the caching section if you
                       need to persist a large amount of data between requests.
          '''
          # Convert any ints and longs to strings
          for key, val in items.items():
              if isinstance(val, (int, long)):
                  items[key] = str(val)
  
          # First use our defaults passed when registering the rule
          url_items = dict((key, val) for key, val in self._options.items()
                           if key in self._keywords)
  
          # Now update with any items explicitly passed to url_for
          url_items.update((key, val) for key, val in items.items()
                           if key in self._keywords)
  
          # Create the path
          path = self._make_path(url_items)
  
          # Extra arguments get tacked on to the query string
          qs_items = dict((key, val) for key, val in items.items()
                          if key not in self._keywords)
          qs = self._make_qs(qs_items)
  
          if qs:
              return '?'.join([path, qs])
          return path