abstraction observer