There are two major approaches to doing controlled vocabularies in
or using a sealed trait with case objects. Here’s a controlled
vocabulary for account status that uses the latter approach:
sealed trait AccountStatus case object Active extends AccountStatus case object Suspended extends AccountStatus case object Cancelled extends AccountStatus
Because longevity supports case objects and polymorphism, this pattern directly translates into a longevity domain model. We are free to use this controlled vocabulary in our domain, such as:
import longevity.model.annotations.persistent @persistent[DomainModel] case class Account( name: String, accountStatus: AccountStatus)
We just need to annotate the members of our controlled vocabulary with
import longevity.model.annotations.polyComponent import longevity.model.annotations.derivedComponent @polyComponent[DomainModel] sealed trait AccountStatus @derivedComponent[DomainModel, AccountStatus] case object Active extends AccountStatus @derivedComponent[DomainModel, AccountStatus] case object Suspended extends AccountStatus @derivedComponent[DomainModel, AccountStatus] case object Cancelled extends AccountStatus
As with polymorphic components, we must remember to seal the trait to form a proper abstract data type.
scala.Enumeration would be a great addition, and is on our story
board. If you are interested, this would be a
great user contribution, and we would be happy to support you in implementing it however we can.