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))
        }
    }
}