Redesign the implementation of Button and ButtonBuilder