refactored Button API