title: Override toString in scala enumeratum
body: <p>Let's say I have the following enum defined:</p>
  <pre class="lang-scala prettyprint-override"><code>import enumeratum._
  import enumeratum.EnumEntry.Lowercase
  
  import scala.collection.immutable
  
  sealed trait Day extends EnumEntry with Lowercase
  
  object Day extends Enum[Day]{
    case object MON extends Day
    case object TUE extends Day
    case object WED extends Day
    /* ... */
    override def values: immutable.IndexedSeq[Day] = findValues
  }
  </code></pre>
  <pre class="lang-scala prettyprint-override"><code>println(Day.Mon)           // MON, but I would like to see mon instead
  println(Day.Mon.entryName) // mon
  </code></pre>
  <p>I would like to override <code>Day.toString</code> to return the entry name instead of class name.
  But seems that it is not so intuitive.</p>
  <h3>What I have tried:</h3>
  <ol>
  <li>Manually override <code>toString</code> to return <code>entryName</code>:</li>
  </ol>
  <pre class="lang-scala prettyprint-override"><code>sealed trait Day extends EnumEntry with Lowercase {
    override def toString: String = entryName
  }
  </code></pre>
  <p>But it produces StackOverflowError (related to lazy val):</p>
  <pre><code>Exception in thread &quot;main&quot; java.lang.StackOverflowError
      at example.Day$MON$.enumeratum$EnumEntry$$stableEntryName(Day.scala:17)
      at enumeratum.EnumEntry.entryName(EnumEntry.scala:21)
      at enumeratum.EnumEntry.entryName$(EnumEntry.scala:21)
      at example.Day$MON$.enumeratum$EnumEntry$Lowercase$$super$entryName(Day.scala:17)
      at enumeratum.EnumEntry$Lowercase.enumeratum$EnumEntry$Lowercase$$stableEntryName(EnumEntry.scala:122)
      at enumeratum.EnumEntry$Lowercase.enumeratum$EnumEntry$Lowercase$$stableEntryName$(EnumEntry.scala:122)
      at example.Day$MON$.enumeratum$EnumEntry$Lowercase$$stableEntryName$lzycompute(Day.scala:17)
      at example.Day$MON$.enumeratum$EnumEntry$Lowercase$$stableEntryName(Day.scala:17)
      at enumeratum.EnumEntry$Lowercase.entryName(EnumEntry.scala:120)
      at enumeratum.EnumEntry$Lowercase.entryName$(EnumEntry.scala:120)
      at example.Day$MON$.entryName(Day.scala:17)
      at example.Day.toString(Day.scala:13)
      at example.Day.toString$(Day.scala:13)
      at example.Day$MON$.toString(Day.scala:17)
      at enumeratum.EnumEntry.enumeratum$EnumEntry$$stableEntryName(EnumEntry.scala:23)
      at enumeratum.EnumEntry.enumeratum$EnumEntry$$stableEntryName$(EnumEntry.scala:23)
      at example.Day$MON$.enumeratum$EnumEntry$$stableEntryName$lzycompute(Day.scala:17)
      at example.Day$MON$.enumeratum$EnumEntry$$stableEntryName(Day.scala:17)
  </code></pre>
  <ol start="2">
  <li>Specify which exactly <code>super</code> method to use:</li>
  </ol>
  <pre class="lang-scala prettyprint-override"><code>
  sealed trait Day extends EnumEntry with Lowercase {
    override def toString: String = super[Lowercase].entryName
  }
  </code></pre>
  <p>But still SOE.</p>
  <ol start="3">
  <li>I know it is possible with manually overriding entry name but it requires writing boilerplate code:</li>
  </ol>
  <pre class="lang-scala prettyprint-override"><code>
  abstract class Day(override val entryName: String) extends EnumEntry {
    override def toString: String = entryName
  }
  
  object Day extends Enum[Day]{
    case object MON extends Day(&quot;mon&quot;)
    case object TUE extends Day(&quot;tue&quot;)
    case object WED extends Day(&quot;wed&quot;)
    /* ... */
    override def values: immutable.IndexedSeq[Day] = findValues
  }
  </code></pre>
  <ol start="4">
  <li>It works well with <code>StringEnum</code> but again, I will need to write boilerplate code for literals.</li>
  </ol>