add observer pattern
singleton pattern