scala/ScalaBook/chapter-03/mixinB.scala

class Person {
  var name = "Mitsos"
  var _height: Int = 180
  def hasItem(key:Int): Boolean =
    if (key == 1)
       true
    else
      false
  def height = _height
}

trait _Block {
  def canOpen(p: Person) = false
  def canPass(p: Person) = false
}

trait Door extends _Block {
  override def canOpen(p: Person) : Boolean = 
    return true
  override def canPass(p: Person) : Boolean =
    return true
}

trait LockedDoor extends _Block { this: Door => 
  override def canOpen(p: Person): Boolean = {
    if (!p.hasItem(theKey)) {
      println("You don't have the Key")
      return false
    }
    println("Using key...")
    return super.canOpen(p)
  }
}

trait ShortDoor extends _Block { this: Door => 
  override def canPass(p: Person): Boolean = {
    if (p.height > 180) {
      println("You are too tall")
      return false
    }
    println("Ducking into door...")
    return super.canPass(p)
  }
}

class LockedShortDoor extends Door 
      with LockedDoor with ShortDoor

val theKey = 2

val door = new LockedShortDoor
val μήτσος = new Person
door canOpen μήτσος
door canPass μήτσος