def link_function(c_return_type, function_name, parameter_types)
delegate_function_name = "C_delegate_#{function_name}"
return_type = Type.new(c_return_type, link_type(c_return_type))
parameters = parameter_types.map_with_indices { |type, index| Parameter.new(type, link_type(type), index) }
c_code = "\#{return_type.c_transfer_type} \#{delegate_function_name}(\#{parameters.c_method_parameters.join(', ')}) {\n\#{return_type.void? ? '' : \"return (\#{return_type.c_transfer_type})\"} \#{function_name}(\#{parameters.c_casted_call_args.join(', ')});\n}\n"
self.c_singleton c_code
line = __LINE__; ruby_code = "def self.\#{function_name}(\#{parameters.ruby_method_parameters.join(', ')})\n\#{parameters.ruby_ref_assigns.reject_nils.join('; ')}\nreturn_values = []\n\#{return_type.void? ? '' : ('return_values << ' + return_type.ruby_type_conversion)}(\#{delegate_function_name}(\#{parameters.ruby_transformed_call_args.join(', ')}))\n\#{parameters.ruby_converted_return_values.reject_nils.prefix('return_values << ').join('; ')}\ncase return_values.size\nwhen 0: nil\nwhen 1: return_values[0]\nelse return_values\nend\nend\ndef \#{function_name}(\#{parameters.ruby_method_parameters.join(', ')})\nself.class.\#{function_name}(\#{parameters.arg_names.join(', ')})\nend\n"
@mod.class_eval ruby_code, __FILE__, line + 1
end