 <p>I'm not sure you should really use implicits like this, but maybe in some DSL this might be a valid use case.</p> <pre><code>class StringExtensions(str: String, strategy: StringExtensionsStrategy) { def doSth() = strategy.doSth(str) } trait StringExtensionsStrategy extends (String =&gt; StringExtensions) { final def apply(str: String) = new StringExtensions(str, this) def doSth(str: String): String } class Strategy1 extends StringExtensionsStrategy { override def doSth(str: String) = "a" } class Strategy2 extends StringExtensionsStrategy { override def doSth(str: String) = "b" } def someMethod(implicit strategy: StringExtensionsStrategy) = { val name = "Pawel" name.doSth() } val ret: String = someMethod(new Strategy1()) </code></pre> <hr> <p>As mentioned in the comments, an alternative encoding would be this:</p> <pre><code>class StringExtensions(str: String, strategy: StringExtensionsStrategy) { def doSth() = strategy.doSth(str) } trait StringExtensionsStrategy { implicit final def apply(str: String) = new StringExtensions(str, this) def doSth(str: String): String } class Strategy1 extends StringExtensionsStrategy { override def doSth(str: String) = "a" } class Strategy2 extends StringExtensionsStrategy { override def doSth(str: String) = "b" } def someMethod(strategy: StringExtensionsStrategy) = { import strategy._ val name = "Pawel" name.doSth() } val ret: String = someMethod(new Strategy1()) </code></pre>