How to clone a case class instance and change just one field in Scala?

Let's say I have a case class that represents personas, people on different social networks. Instances of that class are fully immutable, and are held in immutable collections, to be eventually modified by an Akka actor.

Now, I have a case class with many fields, and I receive a message that says I must update one of the fields, something like this:

case class Persona(serviceName  : String,
                   serviceId    : String,
                   sentMessages : Set[String])

// Somewhere deep in an actor
val newPersona = Persona(existingPersona.serviceName,
                         existingPersona.serviceId,
                         existingPersona.sentMessages + newMessage)

Notice I have to specify all fields, even though only one changes. Is there a way to clone existingPersona and replace only one field, without specifying all the fields that don't change? Can I write that as a trait and use it for all my case classes?

If Persona was a Map-like instance, it would be easy to do.


ANSWERS:


case classcomes with a copy method that is dedicated exactly to this usage:

val newPersona = existingPersona.copy(sentMessages = 
                   existingPersona.sentMessages + newMessage)

Since 2.8, Scala case classes have a copy method that takes advantage of named/default params to work its magic:

val newPersona =
  existingPersona.copy(sentMessages = existing.sentMessages + newMessage)

You can also create a method on Persona to simplify usage:

case class Persona(
  svcName  : String,
  svcId    : String,
  sentMsgs : Set[String]
) {
  def plusMsg(msg: String) = this.copy(sentMsgs = this.sentMsgs + msg)
}

then

val newPersona = existingPersona plusMsg newMsg

existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage)


 MORE:


 ? How do I pull apart Case Classes filled with Options in Scala
 ? How to represent a partial update on case classe in Scala ?
 ? What's the best way to extract a value from a scala case class?
 ? Internal case class in scala
 ? IntelliJ Scala Plugin's case class indentation is absurd
 ? IntelliJ Scala Plugin's case class indentation is absurd
 ? IntelliJ Scala Plugin's case class indentation is absurd
 ? Scala/IntelliJ: case object X vs case class X vs case class X()
 ? value of case class parameter is not a member of Serializable
 ? how to display value of case class in scala