app/com/gu/memsub/BillingPeriod.scala (79 lines of code) (raw):

package com.gu.memsub sealed trait BillingPeriod { def noun: String def adverb: String def adjective: String def annual: Boolean = false def monthsInPeriod: Int } object BillingPeriod { sealed trait RecurringPeriod extends BillingPeriod sealed trait OneOffPeriod extends BillingPeriod case object Month extends RecurringPeriod { override def noun = "month" override def adverb = "monthly" override def adjective = "monthly" override def monthsInPeriod = 1 } case object Quarter extends RecurringPeriod { override def noun = "quarter" override def adverb = "quarterly" override def adjective = "quarterly" override def monthsInPeriod = 3 } case object SixMonthsRecurring extends RecurringPeriod { override def noun = "six months" override def adverb = "six monthly" override def adjective = "six monthly" override def monthsInPeriod = 6 } case object Year extends RecurringPeriod { override def noun = "year" override def adverb = "annually" override def adjective = "annual" override def annual = true override def monthsInPeriod = 12 } case object OneYear extends OneOffPeriod { override def noun = "1 year" override def adverb = "1 year" override def adjective = "1 year" override def monthsInPeriod = 12 } case object TwoYears extends OneOffPeriod { override def noun = "2 years" override def adverb = "2 years" override def adjective = "2 years" override def monthsInPeriod = 24 } case object ThreeYears extends OneOffPeriod { override def noun = "3 years" override def adverb = "3 years" override def adjective = "3 years" override def monthsInPeriod = 36 } case object SixWeeks extends OneOffPeriod{ override def noun = "6 weeks" override def adverb = "6 weeks" override def adjective = "6 weeks" override def monthsInPeriod = 1 // todo this doesn't make sense for periods that are not a exact number of months } case object SixMonths extends OneOffPeriod{ override def noun = "6 months" override def adverb = "6 months" override def adjective = "6 months" override def monthsInPeriod = 6 } case object ThreeMonths extends OneOffPeriod{ override def noun = "3 months" override def adverb = "3 months" override def adjective = "3 months" override def monthsInPeriod = 3 } case object OneTimeChargeBillingPeriod extends OneOffPeriod{ override def noun = "One time charge" override def adverb = "One time charge" override def adjective = "One time charge" override def monthsInPeriod = 1 // this doesn't really make sense for a one time charge } }