add Template Method pattern