add observer pattern interface