class EacRubyUtils::CustomFormat::String

def initialize(format, string)

def initialize(format, string)
  @format = format
  @string = string
end

def mapping

def mapping
  @mapping ||= format.mapping.slice(*sequences)
end

def sequences

def sequences
  @sequences ||= string.scan(SEQUENCE_PATTERN).map(&:first).uniq.map(&:to_sym)
end

def source_object_value(object, method)

def source_object_value(object, method)
  return object.send(method) if object.respond_to?(method)
  return object[method] if object.respond_to?('[]')
  raise ::ArgumentError, "Methods \"#{method}\" or \"[]\" not found for #{object}"
end

def with(source_object)

def with(source_object)
  r = string
  mapping.each do |key, method|
    r = r.gsub(/%#{::Regexp.quote(key)}/, source_object_value(source_object, method).to_s)
  end
  r.gsub('%%', '%')
end