class ReeMapper::MapperStrategy

def assign_value(object, field, value)

def assign_value(object, field, value)
  output.assign_value(object, field, value)
end

def build_object

def build_object
  output.build_object
end

def build_output(dto)

def build_output(dto)
  if dto == Hash || (defined?(OpenStruct) && dto == OpenStruct)
    ReeMapper::HashOutput.new(dto)
  elsif dto == Struct
    ReeMapper::StructOutput.new
  else
    ReeMapper::ObjectOutput.new(dto)
  end
end

def dto

def dto
  output.dto
end

def dto=(dto)

def dto=(dto)
  @output = build_output(dto)
  nil
end

def get_value(obj, field)

def get_value(obj, field)
  if obj.is_a?(Hash)
    obj.key?(field.from) ? obj[field.from] : obj[field.from_as_str]
  else
    obj.public_send(field.from)
  end
end

def has_value?(obj, field)

def has_value?(obj, field)
  if obj.is_a?(Hash)
    obj.key?(field.from) || obj.key?(field.from_as_str)
  else
    obj.respond_to?(field.from)
  end
end

def initialize(method:, dto:, always_optional:)

def initialize(method:, dto:, always_optional:)
  @method          = method
  @output          = build_output(dto)
  @always_optional = always_optional
end

def initialize_dup(_orig)

def initialize_dup(_orig)
  @output = @output.dup
  super
end

def prepare_dto(field_names)

def prepare_dto(field_names)
  output.prepare_dto(field_names)
end