generic observer