add Observer pattern