sclass DateStructures { asclass SomeDate {} asclass SomeDateDate > SomeDate {} // day or higher granularity asclass SomeTime > SomeDate {} asclass SomeWeek > SomeDateDate {} asclass DateProp > SomeDate {} // proposition on a date, e.g. a date range // years transformable srecord Year(int year) > SomeDateDate {} transformable srecord CurrentYearPlus(int nYears) > SomeDateDate {} // months transformable srecord Month(int month, Year year) > SomeDateDate { Month(int month) { this(month, null); } } transformable srecord CurrentMonthPlus(int nMonths) > SomeDateDate {} // weeks transformable srecord Week(int week, Year year) > SomeWeek {} transformable srecord CurrentWeekPlus(int nWeeks) > SomeWeek {} // days transformable srecord Day(int day, Month month) > SomeDate {} transformable srecord TodayPlus(int nDays) > SomeDate {} // weekdays transformable srecord Weekday(int weekday, SomeWeek week) > SomeDateDate { // weekday is in Java count (1=Sunday) Weekday(int weekday) { this.weekday = weekday; } } // hours transformable srecord Hour(int hour, Bool isPM, Day day) > SomeTime { Hour(int hour, Bool isPM) { this(hour, isPM, null); } } transformable srecord CurrentHourPlus(int nHours) > SomeTime {} // minutes transformable srecord Minute(int minute, Hour hour) > SomeTime {} transformable srecord CurrentMinutePlus(int nMinutes) > SomeTime {} // seconds transformable srecord Second(int second, Minute minute) > SomeTime {} // special stuff transformable srecord BeginningOfTime > SomeDate {} transformable srecord EndOfTime > SomeDate {} // date ranges & boolean operations transformable srecord Between(SomeDate from, SomeDate to) > DateProp {} transformable srecord Or(DateProp a, DateProp b) > DateProp {} transformable srecord And(DateProp a, DateProp b) > DateProp {} transformable srecord Not(DateProp a) > DateProp {} // some utility functions sbool containsTimes(SomeDate d) { ret defaultMetaTransformer().any(o -> o instanceof SomeTime, d); } sbool containsDateDates(SomeDate d) { ret defaultMetaTransformer().any(o -> o instanceof SomeDateDate, d); } }