module DateFieldTrait
  as_trait do |*fields|
    fields.each do |field|
      set_field = "#{field}="
      field_var = "@#{field}"
      attr_reader field
      define_method(set_field) do |value|
        if value.is_a?(String)
          begin
            value = Date.parse(value)
          rescue ArgumentError
          end
        end
        value = nil unless value.is_a?(Date)
        instance_variable_set field_var, value
      end
    end
  end
end