@classmethod
def updateAll(Implementation, critic, query, cached_objects):
    """Execute the query and update all cached objects

           The query must take a single parameter, which is a list of object
           ids. It will be executed with the list of ids of all cached
           objects. Each returned row must have the id of the object as the
           first item, and the implementation constructor must take the row
           as a whole as arguments:

             new_impl = Implementation(*row)"""
    cursor = critic.getDatabaseCursor()
    cursor.execute(query, (list(cached_objects.keys()),))
    for row in cursor:
        cached_objects[row[0]]._set_impl(Implementation(*row))
