observer pattern
adaptor pattern