docs: def where(self, custom_restrictions=[], **restrictions):
          """
          Analog to SQL "WHERE". Does not perform a query until `select` is
          called. Returns a repo object. Options selected through keyword
          arguments are assumed to use == unles the value is a list, tuple, or
          dictionary. List or tuple values translate to an SQL `IN` over those
          values, and a dictionary looks up under a different table when joined.
  
          ex)
  
          >>> Repo("foos").where(id=11).select("*")
          SELECT foos.* FROM foos WHERE foos.id == 11
          >>> Repo("foos").where([("id > ?", 12)]).select("*")
          SELECT foos.* FROM foos WHERE foos.id > 12
          >>> Repo("foos").where(id=[1,2,3]).select("*")
          SELECT foos.* FROM foos WHERE foos.id IN (1, 2, 3)
          """
          # Generate the SQL pieces and the relevant values
          standard_names, standard_values = self._standard_items(restrictions)
          custom_names, custom_values = self._custom_items(custom_restrictions)
          in_names, in_values = self._in_items(restrictions)
          query_names = standard_names + custom_names + in_names
          # Stitch them into a clause with values
          if query_names:
              self.where_values = standard_values + custom_values + in_values
              self.where_clause = "where {query} ".format(
                  query=" and ".join(query_names))
          return self