def build(name, *args, &block)
case name.to_s
when /^daily_(\d{1,2})_(\d{2})([ap]m)_to_(\d{1,2})_(\d{2})([ap]m)$/
st_hr, st_min, st_m, end_hr, end_min, end_m = $1, $2, $3, $4, $5, $6
args = parse_time(st_hr, st_min, st_m)
args.concat(parse_time(end_hr, end_min, end_m))
return REDay.new(*args)
when Regexp.new('^weekly_' + DAYS + '_to_' + DAYS + '$')
st_day, end_day = $1, $2
return REWeek.new(Runt.const(st_day), Runt.const(end_day))
when Regexp.new('^monthly_(\d{1,2})' + ORDINAL_SUFFIX + '_to_(\d{1,2})' \
+ ORDINAL_SUFFIX + '$')
st_day, end_day = $1, $2
return REMonth.new(st_day, end_day)
when Regexp.new('^yearly_' + MONTHS + '_(\d{1,2})_to_' + MONTHS + '_(\d{1,2})$')
st_mon, st_day, end_mon, end_day = $1, $2, $3, $4
return REYear.new(Runt.const(st_mon), st_day, Runt.const(end_mon), end_day)
when Regexp.new('^' + DAYS + '$')
return DIWeek.new(Runt.const(name.to_s))
when Regexp.new(WEEK_OF_MONTH_ORDINALS + '_' + DAYS)
ordinal, day = $1, $2
return DIMonth.new(Runt.const(ordinal), Runt.const(day))
else
nil
end
end