I have a basic Table / Column DSL definition.
import scala.collection.parallel.mutable.ParHashSet
abstract class Column[Owner <: Table[Owner, Record], Record, ValueType](table: Table[Owner, Record]) {
table.addColumn(this)
}
class Table[Owner <: Table[Owner, Record], Record] {
private[this] val _columns = ParHashSet.empty[Column[Owner, Record, _]]
def columns: List[Column[Owner, Record, _]] = _columns.toList
def addColumn(column: Column[Owner, Record, _]) {
_columns += column
}
}
class SpecialColumn[Owner <: Table[Owner, Record], Record, ValueType](table: Table[Owner, Record]) extends Column[Owner, Record, ValueType](table) {//blabla}
The point is to define a Table like this:
case class SomeModel(name: String, prop: String)
sealed class SomeTable extends Table[SomeTable, SomeModel] {
object name extends Column[SomeTable, SomeModel, String](this)
object prop extends SpecialColumn[SomeTable, SomeModel, String](this)
}
object SomeTable extends SomeTable {}
I want SomeTable to store references to the objects defined inside it. Therefore the Column constructor calls addColumn on instantiation.
Therefore SomeTable.columns.length should be 2, but it's always 1.
What am I missing here? Here's a Scala fiddle.