trait CSSStyle { def styleElements : Map[String, String] = Map() } object CSSStyle { // Static-like method to render a CSS key/value pair def renderStyleElement(element : (String,String)) = element._1 + ": " + element._2 } trait Bold extends CSSStyle { override def styleElements = super.styleElements + ("font-weight" -> "bold"); } trait Italic extends CSSStyle { override def styleElements = super.styleElements + ("font-style" -> "italic") } trait SansSerif extends CSSStyle { override def styleElements = super.styleElements + ("font-family" -> "Helvetica, Arial, sans-serif") } class StyledElement(element : String) extends CSSStyle { override def toString = "<" + element + " style=\"" + styleElements.map(CSSStyle.renderStyleElement).mkString("; ") + "\"></" + element +">"; } class StyleRule(rule : String) extends CSSStyle { override def toString = rule + " {\n " + styleElements.map(CSSStyle.renderStyleElement).mkString(";\n ") + "\n}"; } object RunCSSStyle { def main(args: Array[String]) { println(new StyledElement("span") with Bold with Italic with SansSerif) println(new StyleRule(".important") with Bold with Italic with SansSerif) } }