class Address attr_accessor :street1, :street2, :city, :state, :zip, :country def initialize(street1, street2, city, state, zip, country) @street1 = street1 @street2 = street2 @city = city @state = state @zip = zip @country = country end def to_s(format: nil) case format when :full join_with_newline( street1, street2, join_with_comma(city, state_and_zip), country ) when :condensed join_with_newline( join_with_comma(street1, street2), join_with_comma(city, state_and_zip, country), ) else join_with_comma(street1, street2, city, state_and_zip, country) end end def present? [street1, street2, city, state, zip, country].any?(&:present?) end private def join_without_blanks(*parts, separator: ", ") parts.reject(&:blank?).join(separator) end def join_with_comma(*parts) join_without_blanks(*parts) end def join_with_newline(*parts) join_without_blanks(*parts, separator: "\n") end def state_and_zip join_without_blanks(state, zip, separator: " ") end end