Roll your own objects with a type-safe imperative Scala DSL