module Mail::CommonAddress

def <<(val)

def <<(val)
  case
  when val.nil?
    raise ArgumentError, "Need to pass an address to <<"
  when val.blank?
    parse(encoded)
  else
    parse((formatted + [val]).join(", "))
  end
end

def addresses

Returns the address string of all the addresses in the address list
def addresses
  list = tree.addresses.map { |a| a.address }
  Mail::AddressContainer.new(self, list)
end

def addrs

Returns the actual address objects in the address list
def addrs
  list = tree.addresses
  Mail::AddressContainer.new(self, list)
end

def charset

def charset
  @charset
end

def default

def default
  addresses
end

def display_names

Returns the display name of all the addresses in the address list
def display_names
  list = tree.addresses.map { |a| a.display_name }
  Mail::AddressContainer.new(self, list)
end

def do_decode

def do_decode
  return nil if value.blank?
  address_array = tree.addresses.reject { |a| group_addresses.include?(a.decoded) }.map { |a| a.decoded }
  address_text  = address_array.join(", ")
  group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
  group_text  = group_array.join(" ")
  return_array = [address_text, group_text].reject { |a| a.blank? }
  return_array.join(", ")
end

def do_encode(field_name)

def do_encode(field_name)
  return '' if value.blank?
  address_array = tree.addresses.reject { |a| group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
  address_text  = address_array.join(", \r\n\s")
  group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
  group_text  = group_array.join(" \r\n\s")
  return_array = [address_text, group_text].reject { |a| a.blank? }
  "#{field_name}: #{return_array.join(", \r\n\s")}\r\n"
end

def each

Allows you to iterate through each address object in the syntax tree
def each
  tree.addresses.each do |address|
    yield(address)
  end
end

def encode_if_needed(val)

def encode_if_needed(val)
  Encodings.address_encode(val, charset)
end

def formatted

Returns the formatted string of all the addresses in the address list
def formatted
  list = tree.addresses.map { |a| a.format }
  Mail::AddressContainer.new(self, list)
end

def get_group_addresses(group_list)

def get_group_addresses(group_list)
  if group_list.respond_to?(:addresses)
    group_list.addresses.map do |address_tree|
      Mail::Address.new(address_tree)
    end
  else
    []
  end
end

def group_addresses

Returns the addresses that are part of groups
def group_addresses
  groups.map { |k,v| v.map { |a| a.format } }.flatten
end

def group_names # :nodoc:

:nodoc:
Returns the name of all the groups in a string
def group_names # :nodoc:
  tree.group_names
end

def groups

Returns a hash of group name => address strings for the address list
def groups
  @groups = Hash.new
  tree.group_recipients.each do |group|
    @groups[group.group_name.text_value.to_str] = get_group_addresses(group.group_list)
  end
  @groups
end

def parse(val = value)

def parse(val = value)
  unless val.blank?
    @tree = AddressList.new(encode_if_needed(val))
  else
    nil
  end
end

def tree # :nodoc:

:nodoc:
Returns the syntax tree of the Addresses
def tree # :nodoc:
  @tree ||= AddressList.new(value)
end