add fluent API and with* methods