Case Classes 

Case classes are defined using CASECLASSDEF(...):

scala> import treehugger.forest._, definitions._, treehuggerDSL._
import treehugger.forest._
import definitions._
import treehuggerDSL._

scala> object sym {
  val Expr = RootClass.newClass("Expr")
  val Var  = RootClass.newClass("Var")
}
defined module sym

scala> val tree = (CLASSDEF(sym.Expr) withFlags(Flags.SEALED, Flags.ABSTRACT): Tree)
tree: treehugger.forest.Tree = ClassDef(Modifiers(sealed abstract, , Map()),Modifiers(, , Map()),Expr,List(),List(),Template(List(),ValDef(Modifiers(private, , Map()),Ident(_),EmptyTree),List()))

scala> treeToString(tree)
res0: String = sealed abstract class Expr

scala> val tree2 = (CASECLASSDEF(sym.Var)
  withParams(PARAM("name", StringClass)) withParents(sym.Expr): Tree)
tree2: treehugger.forest.Tree = ClassDef(Modifiers(case, , Map()),Modifiers(, , Map()),Var,List(),List(ValDef(Modifiers(<param>, , Map()),Typed(Ident(name),TypeTree()),EmptyTree)),Template(List(TypeTree()),ValDef(Modifiers(private, , Map()),Ident(_),EmptyTree),List()))

scala> treeToString(tree2)
res1: String = case class Var(name: String) extends Expr