All scala declarative style is just an illusion. Scala is build upon a jvm and works like java.
Evetything is a class and should be independent on its usage (java is not c++ and supports incremental build with its pros and cons). Every trait has its own initialization code and multi-trait class runs respective initialization code one by one. If you use some AnyRef that is declared only in a subclass than that its value will be set for null during initialization.
I guard myself with specifing convention rule: every val should be either final or lazy (why using plain val in non-final classes) . So I don't care about initialization order and may pretend further that I'm using declarative language.
Also I'm using option -Xcheckinit
: Add runtime check to field accessors.