class AService(bService: BService) {
  println(s"hi from $this constructor, b is $bService")
  def greet: Unit = println(s"hi from $this greet, b is $bService")
}

class BService(aService: AService) {
  println(s"hi from $this constructor, a is $aService")
  def greet: Unit = println(s"hi from $this greet, a is $aService")
}

trait TopComponent {
  val aService: AService = new AService(bService)
  val bService: BService = new BService(aService)
}

object Application extends App with TopComponent {
  aService.greet
  bService.greet
}