scala/ScalaBook/chapter-03/mixinA.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 Door {
  def canOpen(p: Person) : Boolean = 
    return true
  def canPass(p: Person) : Boolean =
    return true
}

trait Locked extends 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 Short extends 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 LockedDoor extends Door with Locked { }
class ShortDoor extends Door with Short { }
class LockedShortDoor extends Door with Locked with Short { }

var key:Int = 1
var theKey: Int = 2