/** * Example of an immutable pojo with a built-in builder. * Still pretty ugly translation of java version at http://pastebin.com/zt8vE8Fw * @author twitter.com/benhardy */ class PersonFeatures2(val userId:Int, val age:Int, val children:Int, val dogs:Int) { } object PersonFeatures2 { // give each stage of the builder only one callable method, // which returns the next stage trait BuilderUserIdSpec { def userId(v:Int): BuilderAgeSpec } trait BuilderAgeSpec { def age(v:Int) : BuilderChildrenSpec } trait BuilderChildrenSpec { def children(v:Int) : BuilderDogsSpec } trait BuilderDogsSpec { def dogs(v:Int): BuilderFinal } trait BuilderFinal { def build : PersonFeatures2 } def builder = { new BuilderUserIdSpec() { override def userId(_userId:Int) = { new BuilderAgeSpec() { override def age(_age:Int) = { new BuilderChildrenSpec() { override def children(_children:Int) = { new BuilderDogsSpec() { override def dogs(_dogs:Int) = { new BuilderFinal() { override def build = { new PersonFeatures2(_userId, _age, _children, _dogs) } } } } } } } } } } } /** * example usage. pretty obvious what is going on. only one way to do it. IDE will help. */ val person = builder userId(4437) age(22) children(0) dogs(1) build }