split responsiblities to separate objects