# typed: true module RecurringTodos class FormHelper def initialize(recurring_todo) @recurring_todo = recurring_todo @method_map = { # delegate daily_xxx to daily_pattern.xxx "daily" => {prefix: "", method: daily_pattern}, "weekly" => {prefix: "", method: weekly_pattern}, "monthly" => {prefix: "", method: monthly_pattern}, "yearly" => {prefix: "", method: yearly_pattern}, # delegate on_xxx to weekly_pattern.on_xxx "on" => {prefix: "on_", method: weekly_pattern} } end def create_pattern(pattern_class) pattern = pattern_class.new(@recurring_todo.user) pattern.build_from_recurring_todo(@recurring_todo) pattern end def daily_pattern @daily_pattern ||= create_pattern(DailyRecurrencePattern) end def weekly_pattern @weekly_pattern ||= create_pattern(WeeklyRecurrencePattern) end def monthly_pattern @monthly_pattern ||= create_pattern(MonthlyRecurrencePattern) end def yearly_pattern @yearly_pattern ||= create_pattern(YearlyRecurrencePattern) end def method_missing(method, *args) # delegate daily_xxx to daily_pattern, weekly_xxx to weekly_pattern, etc. if method.to_s =~ /^([^_]+)_(.+)$/ return @method_map[$1][:method].send(@method_map[$1][:prefix]+$2, *args) unless @method_map[$1].nil? end # no match, let @recurring_todo handle it, or fail @recurring_todo.send(method, *args) end end end