trait A
{
  print("-A")

  def delayedInit(body: => Unit) = {
    body
    postConstructionCode
  }
  def postConstructionCode: Unit = {
    print("\n A+")
  }
}
trait B extends A {
  print(" -B")
  override def postConstructionCode: Unit = {
    super.postConstructionCode
    print(" B+")
  }
}

trait C extends B {
  print(" -C")
  override def postConstructionCode: Unit = {
    super.postConstructionCode
    print(" C+")
  }
}

class D() extends C  {
  print(" -D")
  override def postConstructionCode: Unit = {
    super.postConstructionCode
    print(" D+")
  }
}
class E() extends D() {
  print(" -E")
  override def postConstructionCode: Unit = {
    super.postConstructionCode
    print(" E+")
  }
}

object Test {
  def p(msg: String) = println("\n\n// " + msg)

  def main(args: Array[String]) {
    val f: A => Unit = _.postConstructionCode

    p("new C { }")
    f(new C { })
    p("new C { 5 }")
    f(new C { 5 })

    p("new D()")
    f(new D())
    p("new D() { }")
    f(new D() { })

    p("new D() { val x = 5 }")
    f(new D() { val x = 5 })
    p("new { val x = 5 } with D()")
    f(new { val x = 5 } with D())

    p("new E() { val x = 5 }")
    f(new E() { val x = 5 })
    p("new { val x = 5 } with E()")
    f(new { val x = 5 } with E())

    p("new { val x = 5 } with E() { }")
    f(new { val x = 5 } with E() { })
    p("new { val x = 5 } with E() { 5 }")
    f(new { val x = 5 } with E() { 5 })

    println("")
  }
}
