Como usar macros scala para criar um objeto de função (para criar um Map [String, (T) => T])

Eu estou tentando usar macros Scala para criar um mapa de classe de caso de um único parâmetrocopy métodos, com cada método aceitando um Play JsonJsValue e uma instância de classe de caso e retornando uma cópia atualizada da instância. No entanto, estou tendo problemas com a sintaxe da macro para retornar um objeto de função.

Dada uma classe de caso

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

a intenção é criar um mapa dos métodos de cópia da classe

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), ...)

Eu encontrei duas questões relacionadas:

Usando macros para criar um mapa de campo de classe de caso:Macros do Scala: Fazendo um mapa fora dos campos de uma classe no Scala

Acessando o método de cópia da classe de caso usando uma macro:Como modelar parâmetros nomeados em invocações de métodos com macros Scala?

... mas eu estou preso em como eu posso criar um objeto de função para que eu possa retornar umMap[String, (JsValue, T) => T]

Edit: Graças à sugestão de Eugene Burmako para usar quasiquotes - este é o lugar onde eu estou atualmente no Scala 2.11.0-M7, baseando meu código emPublicação de Jonathan Chow (Eu mudei de usar (T, JsValue) => T para (T, String) => T para simplificar minhas importações REPL)

Edit2: Agora incorporando $ tpe splicing

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