scala/sbEpOcBas3.scala

// package scalabook.ep.oc

/**
 * Base definitions for the Operation-Centric approach.
 * @author Christos KK Loverdos
 */

// Base data
trait BaseD[T] {def perform(op: BaseOp[T])}

// Base operation.
trait BaseOp[T] {def computeNumD(data: BaseD[T])}

// Concrete data implementation.
class NumD(val value: Int) extends BaseD[Int] {
    def perform(op: BaseOp[Int]) {op.computeNumD(this)}
}
// 1st concrete operation: evaluate the data
class EvalOp extends BaseOp[Int] {
  var result: Option[Int] = _
  def apply(data: BaseD) = {data.perform(this); result.get }
  def computeNumD(data: BaseD) {this.result = Some(data.value) }
}

// utility object for on-the-fly evaluations
object eval {def apply(data: BaseD) = new EvalOp()(data)}