Split implementation into three headers