refactored api, use properties with validation in setter instead of builder style methods