move common implementation into parent class