Enumerações de Scala com objetos Singleton como elementos de enumeração e uma possibilidade de iterar sobre eles?

Eu já olhei para oPergunta Scala sobre a emulação de Javaenum eclasses de caso x enumeração mas parece muito esforço para menos benefícios.

Basicamente, eu gostaria de ter umvalues método retornando todos os objetos singleton deDayOfWeek sem me repetir algumas vezes.

É assim que meu código deve ficar:

object DayOfWeek extends MyEnum {
  object MONDAY extends DayOfWeek(1)
  object TUESDAY extends DayOfWeek(2)
  object WEDNESDAY extends DayOfWeek(3)
  object THURSDAY extends DayOfWeek(4)
  object FRIDAY extends DayOfWeek(5)
  object SATURDAY extends DayOfWeek(6)
  object SUNDAY extends DayOfWeek(7)
}

class DayOfWeek(ordinal: Int)

O métodovalues deve retornar algo como se tivesse sido escrito assim:

val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
                   FRIDAY, SATURDAY, SUNDAY)

Tudo deve acontecer noMyEnum característica, então eu só preciso estendê-lo para obter a funcionalidade.

trait MyEnum {
  val values = this.getClass.getField("MODULE$") etc. etc.
}

Alguma sugestão de como isso poderia ser feito exatamente? A ideia é quevalues acessa a classe e localiza todos os objetos singleton da classe que eles estão estendendo.

Editar: parece que todas as sugestões não levam em conta que o usuário também pode criar objetos que, obviamente, devem ser comparáveis aos definidos.

Vou tentar dar outro exemplo, talvez seja mais claro:

object MonthDay extends MyEnum {
  //Some important holidays
  object NewYear       extends MonthDay( 1,  1)
  object UnityDay      extends MonthDay(11,  9)
  object SaintNicholas extends MonthDay(12,  6)
  object Christmas     extends MonthDay(12, 24)
}

class MonthDay(month: Int, day: Int)

//Of course the user can create other MonthDays
val myBirthDay = new MonthDay(month, day)

if(!MonthDay.values.contains(myBirthDay)) "Well, I probably have to work"
else "Great, it is a holiday!"

Eu quero ter uma característica (MyEnum) que eu posso misturar no objeto que contém meus "objetos de enumeração" com métodos para retornar uma lista deles (def values: List[MonthDay]) ou itere sobre eles (def next: MonthDay oudef previous: MonthDay)

PPS:Eu criei uma nova pergunta para a segunda parte desta pergunta conforme solicitado por Ken Bloom.

questionAnswers(3)

yourAnswerToTheQuestion