def METHOD_NAME(dummy):
    class AddStringPrefix(Transformer):
        def visit_str(self, node):
            return 'prefix_' + node
    transformed = AddStringPrefix().visit(dummy)
    assert isinstance(transformed, dummy.__class__)
    # String in subtree
    assert transformed.arg1 == 'prefix_arg1'
    assert transformed.arg1 is not dummy.arg1
    # No string in subtree
    assert transformed.arg2 == None
    assert transformed.arg2 is dummy.arg2
    # String in subtree
    assert transformed.arg3 == ['prefix_arg3_1', 'prefix_arg3_2']
    assert transformed.arg3 is not dummy.arg3
    # No string in subtree
    assert transformed.arg4 == []
    assert transformed.arg4 is dummy.arg4, f'old:({id(dummy.arg4)}, {dummy.arg4}), new:({id(transformed.arg4)}, {transformed.arg4})'
    # String in subtree
    assert transformed.arg5 == {'arg5_k': 'prefix_arg5_v'}
    assert transformed.arg5 is not dummy.arg5
    # No string in subtree
    assert transformed.arg6 == {'arg6_k': None}
    assert transformed.arg6 is dummy.arg6
    # Expected result for arg7 and arg8
    basedict = {'arg1': 'prefix_arg1',
                'arg2': None,
                'arg3': ['prefix_arg3_1',
                        'prefix_arg3_2'],
                'arg4': [],
                'arg5': {'arg5_k': 'prefix_arg5_v'},
                'arg6': {'arg6_k': None},
                'arg7': None,
                'arg8': None}
    # String in subtree
    assert transformed.arg7 == basedict
    assert transformed.arg7 is not dummy.arg7
    # String in subtree
    assert transformed.arg8 == [basedict, basedict]
    assert transformed.arg8 is not dummy.arg8
    # Ensure cache is working for generic_visitor
    assert transformed.arg7 is transformed.arg8[0]
    assert transformed.arg8[0] is transformed.arg8[1]