apply observer pattern halfway