trait DeepCloneable[A] { self: A => def deepClone: A } class Egg(size: Int) extends DeepCloneable[Egg] { def deepClone = new Egg(size) } object Main extends App { val e = new Egg(3) println(e) println(e.deepClone) }