import scala.language.dynamics
object Main extends App {
def to[T](value: Any): T = value.asInstanceOf[T]
class Thing(pairs: Tuple2[String, Any]*) extends Dynamic {
var things: Map[String, Any] = Map[String, Any]()
pairs foreach {p =>
this.things += (p._1 -> p._2)
}
def selectDynamic(key: String): Any = {
if(things contains key)
return (things get key) get
else
return None
}
def updateDynamic(key: String)(value: Any) = {
if(things contains key)
things -= key
things += (key -> value)
}
//Option: get, isEmpty
/*def applyDynamic(key: String)(args: Any*): Any = {
if(things contains key) {
return ((things get key) get) match {
case fn_a: Function[Any] =>
to[Function[Any]](
(things get key) get)()
case fn_a_a: Function[Any, Any] =>
to[Function[Any, Any]](
(things get key) get)(args:_*)
case fn_a_a_a: Function[Any, Any, Any] =>
to[Function[Any, Any, Any]](
(things get key) get)(args:_*)
}
} else
return None
}*/
def apply(key: String): Any = {
if(things contains key)
return (things get key) get
else
return None
}
}
var thing1 = new Thing(
"a" -> 1,
"b" -> 2,
"c" -> new Thing("d" -> 5.6),
"e" -> {(a: Any) => to[Int](a) * 2}
)
println(thing1.things)
//println((thing1("e").asInstanceOf[Function1[Any, Any]])(3))
println(to[Function[Any, Any]](thing1("e"))(3))
}