I don't think that you really will find a better way than just using unapply / apply through pattern matching:
someValue match { case FindCaseClass(a, b, c) => ReplaceCaseClass(a, b, c)
You have to write rules to associate FindCaseClass with ReplaceCaseClass some way, and although you could do it a little more succinctly just by using names, this has the added benefit of also checking the number and type of fields of the case class at compile time to make sure that everything matches only the right one.
There may be a way to do this automatically, using the fact that all case classes extend Product , but the fact that productElement(n) return Any can make it a little pain - I think where the thought was supposed to happen. Here is something to get you started:
case class From(i: Int, s: String, xs: Seq[Nothing]) case class To(i: Int, s: String, xs: Seq[Nothing]) val iter = From(5,"x",Nil).productIterator val f = To.curried iter.foldLeft(f: Any) { _.asInstanceOf[Any => Any](_) } // res0: Any = To(5,x,List())
But actually, I think you're better off with a model version.
Edit: Here is a version with relevant code reorganized into a method:
case class From(i: Int, s: String, xs: Seq[Nothing]) case class To(i: Int, s: String, xs: Seq[Nothing]) type Curryable = { def curried: _ => _ } def recase(from: Product, to: Curryable) = { val iter = from.productIterator val f = to.curried iter.foldLeft(f: Any) { _.asInstanceOf[Any => Any](_) } } recase(From(5,"x",Nil), To) // res0: Any = To(5,x,List())