vistor pattern
composition pattern