Initial commit.

The factory is working for basic cases. The builder macro generates
an apply method with default arguments.