How about...

```ruby
def present(data)
  hsh = data.merge(data) do |key, oldval, _|
    if presenters.has_key?(key)
      presenters[key].new(oldval)
    elsif oldval.is_a?(Array) && presenters.has_key?(key.singularize)
      oldval.map {|item| presenters[key.singularize].new(item) }
    else
      oldval
    end
  end

  @data = OpenStruct.new hsh
end
```