I am trying to replicate enum.values using the trait and case object approach. For example with a regular enum you can do:
object Permission extends Enumeration {
  type Permission = Value
  val SOME_THINGS, EVERYTHING = Value
}
val allEnumValues: Set[Permission] = Permission.values
I need to add logic to each Permission to validate if a user should have it, hence I am trying to use the trait and case object approach. Using this approach the enum becomes something like:
trait Permission {
  def name: String
  def appliesTo(user: User): Boolean
}
object Permission {
  def values: Set[Permission] = ... //  Can I use reflection here?
  case object SOME_THINGS extends Permission {
    override def name: String = "SOME_THINGS"
    override def appliesTo(user: User): Boolean = user.isTeamMember
  }
  case object EVERYTHING extends Permission {
    override def name: String = "EVERYTHING"
    override def appliesTo(user: User): Boolean = user.isAdmin
  }
}
How can I use reflection to get a list of case objects extending Permission and therefore implement my  def values: Set[Permission] method?
 
    