<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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) SELECT foos.* FROM foos WHERE foos.id == 11 SELECT foos.* FROM foos WHERE foos.id > 12 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