I would like to construct my domain model using immutable objects only. But I also want to use traits with val fields and move some functionality to traits. Please look at the f
This should do what you are looking for:
trait Request[T <: Request[T]] extends Cloneable {
this: T =>
private var rets = 0
def retries = rets
def incRetries:T = {
val x = super.clone().asInstanceOf[T]
x.rets = rets + 1
x
}
}
Then you can use it like
case class Download(packageName:String) extends Request[Download]
val d = Download("Test")
println(d.retries) //Prints 0
val d2 = d.incRetries
println(d2.retries) //Prints 1
println(d.retries) //Still prints 0