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?