docs: def vehicles(self, vid=None, rt=None):
          """
          Get busses by route or by vehicle ID.
          
          Arguments: either
              `vid`: "Set of one or more vehicle IDs whose location should be returned." 
                     Maximum of 10 `vid`s, either in a comma-separated list or an iterable.
  
              `rt`: "Set of one or more route designators for which matching vehicles should be returned."
                    Maximum of 10 routes, either in a comma-separated list or an iterable.
                    
          Response:
              `vehicle`: (vehicle container) contains list of
                  `vid`: bus #
                  `tmstmp`: local date/time of vehicle update
                  `lat`, `lon`: position
                  `hdg`: vehicle heading (e.g., 0: north, 180: south)
                  `pid`: pattern ID of current trip (see `self.geopatterns`)
                  `pdist`: distance into trip
                  `rt`: route (e.g, 88)
                  `des`: bus destinations (e.g., "Penn to Bakery Square")
                  `dly` (optional): True if bus is delayed
                  `spd`: speed in mph
                  `zone`: current zone (usually `None` here)
                  `tablockid`, `tatripid`: unsure, seems internal?
                  
          http://realtime.portauthority.org/bustime/apidoc/v1/main.jsp?section=vehicles.jsp
          """
          
          if vid and rt:
              raise ValueError("The `vid` and `route` parameters cannot be specified simultaneously.")
          if not (vid or rt):
              raise ValueError("You must specify either the `vid` or `rt` parameter.")
  
          # Turn list into comma separated string
          if listlike(rt): rt = ",".join( map(str, rt) )
          if listlike(vid): vid = ",".join( map(str, vid) )
  
          url = self.endpoint('VEHICLES', dict(vid=vid, rt=rt))        
          return self.response(url)