Consider this:
class Foo { def foo = \"foo\" } trait Bar { self: Foo => override def foo = \"bar\" }
I was pleasantly surprised
You make your trait extend Foo instead of using the self type:
Foo
class Foo {def foo = "foo"} trait Bar extends Foo { override def foo = super.foo + "bar" } new Foo with Bar foo // barfoo
See also this answer.