template method pattern
template method pattern
observer simplest pattern