Jak używać makr scala do tworzenia obiektu funkcji (aby utworzyć Mapę [String, (T) => T])

Próbuję użyć makr Scala do utworzenia mapy klas przypadków pojedynczego parametrucopy metodami, przy czym każda metoda akceptuje Play JsonJsValue oraz instancję klasy sprawy i zwracającą zaktualizowaną kopię instancji. Mam jednak problemy ze składnią makra do zwracania obiektu funkcji.

Dana klasa przypadku

case class Clazz(id: Int, str: String, strOpt: Option[String])

intencją jest stworzenie mapy metod kopiowania klasy

implicit def jsonToInt(json: JsValue) = json.as[Int]
implicit def jsonToStr(json: JsValue) = json.as[String]
implicit def jsonToStrOpt(json: JsValue) = json.asOpt[String]

Map("id" -> (json: JsValue, clazz: Clazz) = clazz.copy(id = json),
  "str" -> (json: JsValue, clazz: Clazz) = clazz.copy(str = json), ...)

Znalazłem dwa powiązane pytania:

Używanie makr do tworzenia mapy pola klasy sprawy:Makra Scala: Tworzenie mapy z pól klasy w Scali

Uzyskiwanie dostępu do metody kopiowania klasy przypadków przy użyciu makra:Jak modelować nazwane parametry w wywołaniach metod za pomocą makr Scala?

... ale utknąłem na tym, jak mogę utworzyć obiekt funkcji, dzięki czemu mogę go zwrócićMap[String, (JsValue, T) => T]

Edytuj: Dzięki sugestii Eugene'a Burmako, aby używać quasiquotes - w tej chwili używam Scala 2.11.0-M7, opierając mój kod naPost Jonathana Chowa (Przełączam z używania (T, JsValue) => T na (T, String) => T, aby uprościć mój import REPL)

Edit2: Teraz łączenie $ tpe

import scala.language.experimental.macros

implicit def strToInt(str: String) = str.toInt

def copyMapImpl[T: c.WeakTypeTag](c: scala.reflect.macros.Context): 
    c.Expr[Map[String, (T, String) => T]] = {

  import c.universe._

  val tpe = weakTypeOf[T]

  val fields = tpe.declarations.collectFirst {
    case m: MethodSymbol if m.isPrimaryConstructor => m
  }.get.paramss.head

  val methods = fields.map { field => {
    val name = field.name
    val decoded = name.decoded
    q"{$decoded -> {(t: $tpe, str: String) => t.copy($name = str)}}"
  }}

  c.Expr[Map[Sring, (T, String) => T]] {
    q"Map(..$methods)"
  }
}

def copyMap[T]: Map[String, (T, String) => T] = macro copyMapImpl[T]

case class Clazz(i: Int, s: String)

copyMap[Clazz]

questionAnswers(1)

yourAnswerToTheQuestion