fork(1) 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. class BuilderFactory[T, B: ClassTag] {
  44. def create: B = classTag[B].runtimeClass.newInstance().asInstanceOf[B]
  45. }
  46.  
  47. object FixtureBuilder {
  48. def builder[T, B](typ: T)(implicit ev: BuilderFactory[T, B]): B = ev.create
  49. }
  50.  
  51. import FixtureBuilder._
  52. implicit val simpleFactory = new BuilderFactory[Class[Simple], SimpleBuilder]
  53. implicit val complexFactory = new BuilderFactory[Class[Complex], ComplexBuilder]
  54.  
  55. println(builder(classOf[Simple]).one("SOMETEXT").two(22).build())
  56. println(builder(classOf[Complex]).part(3.14).place("London").build())
  57.  
  58. }
Success #stdin #stdout 0.38s 382080KB
stdin
Standard input is empty
stdout
Simple(SOMETEXT,22)
Complex(3.14,London)