fork download
  1. object Main extends App {
  2.  
  3. import scala.reflect._
  4.  
  5. case class Simple(one: String, two: Int)
  6.  
  7. class SimpleBuilder {
  8. var oneValue: Option[String] = None
  9. var twoValue: Option[Int] = None
  10.  
  11. def one(value: String): SimpleBuilder = {
  12. oneValue = Some(value)
  13. }
  14.  
  15. def two(value: Int): SimpleBuilder = {
  16. twoValue = Some(value)
  17. }
  18.  
  19. def build(): Simple = {
  20. Simple(oneValue.getOrElse("DEFAULT"), twoValue.getOrElse(0))
  21. }
  22. }
  23.  
  24. case class Complex(part: Double, place: String)
  25.  
  26. class ComplexBuilder {
  27. var partValue: Option[Double] = None
  28. var placeValue: Option[String] = None
  29.  
  30. def part(value: Double): ComplexBuilder = {
  31. partValue = Some(value)
  32. }
  33.  
  34. def place(value: String): ComplexBuilder = {
  35. placeValue = Some(value)
  36. }
  37.  
  38. def build(): Complex = {
  39. Complex(partValue.getOrElse(0.0), placeValue.getOrElse("DEFAULT"))
  40. }
  41. }
  42.  
  43. trait Buildable[T] {
  44. type Result
  45. def newBuilder: Result
  46. }
  47.  
  48. object Buildable {
  49. implicit object SimpleBuildable extends Buildable[Simple] {
  50. type Result = SimpleBuilder
  51. override def newBuilder = new SimpleBuilder
  52. }
  53.  
  54. implicit object ComplexBuildable extends Buildable[Complex] {
  55. type Result = ComplexBuilder
  56. override def newBuilder = new ComplexBuilder
  57. }
  58.  
  59. def builder[T](implicit B: Buildable[T]): B.Result = B.newBuilder
  60. }
  61.  
  62. import Buildable._
  63.  
  64. println(builder[Simple].one("SOMETEXT").two(22).build())
  65. println(builder[Complex].part(3.14).place("London").build())
  66.  
  67. }
Success #stdin #stdout 0.37s 382080KB
stdin
Standard input is empty
stdout
Simple(SOMETEXT,22)
Complex(3.14,London)