scala/ScalaBook/chapter-12/src/main/scala/scalabook/ep/family/oc/pluslang.scala
package scalabook.ep.family.oc
/**
* Data extension (traditionally difficult in an operation-centric setting)
* @author Christos KK Loverdos
*/
trait PlusLang extends BaseLang {
type Operation <: BaseOp
trait BaseOp extends super.BaseOp {
def computePlusD(data: PlusD)
}
class PlusD(val a: BaseD, val b: BaseD) extends BaseD {
def perform(op: Operation) {
op.computePlusD(this)
}
}
class EvalOp extends super.EvalOp with BaseOp { this: Operation =>
def computePlusD(data: PlusD) {
this.result = Some(eval(data.a) + eval(data.b))
}
}
}