public static IRubyObject deep(final Ruby runtime, final Object input) {
        if (input == null) {
            return runtime.getNil();
        }
        final Class<?> cls = input.getClass();
        final Rubyfier.Converter converter = CONVERTER_MAP.get(cls);
        if (converter != null) {
            return converter.convert(runtime, input);
        }
        return fallbackConvert(runtime, input, cls);
    }
@Test
    public void testDeepMapWithString() throws Exception {
        Map<String, String> data = new HashMap<>();
        data.put("foo", "bar");
        RubyHash rubyHash = (RubyHash) Rubyfier.deep(RubyUtil.RUBY, data);

        // Hack to be able to retrieve the original, unconverted Ruby object from Map
        // it seems the only method providing this is internalGet but it is declared protected.
        // I know this is bad practice but I think this is practically acceptable.
        Method internalGet = RubyHash.class.getDeclaredMethod("internalGet", IRubyObject.class);
        internalGet.setAccessible(true);
        Object result = internalGet.invoke(rubyHash, JavaUtil.convertJavaToUsableRubyObject(RubyUtil.RUBY, "foo"));

        assertEquals(RubyString.class, result.getClass());
        assertEquals("bar", result.toString());
    }