scala/sbEpOcBas2.scala

// package scalabook.ep.oc

/**
 * Base definitions for the Operation-Centric approach.
 * @author Christos KK Loverdos
 */
// Base data
trait BaseD {def perform(op: BaseOp)}
// Concrete data implementation.
class NumD(val value: Int) extends BaseD {
    def perform(op: BaseOp) = {op.computeNumD(this)}
}

// Base operation.
trait BaseOp {def computeNumD(data: NumD)}

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

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