class FlexMock def self.next_mock_class_name @count = 0 unless @count @count += 1 "RubyCocoa_fake_mock_class_#{@count}" end end # rubycocoa_flexmock(method_name, arg_count, method_name, arg_count, ...) # Returns a mock object that you can use in the normal way. def rubycocoa_flexmock(*descriptions) names = [] args = [] descriptions.each_slice(2) do | name, arg_count | names << name args << (0...arg_count).collect { | i | "arg#{i}" }.join(', ') end defs = SyncEnumerator.new(names, args).collect do | name, arg | "def #{name}(#{args}); end" end class_name = FlexMock.next_mock_class_name class_def = %Q{ class #{class_name} < OSX::NSObject #{defs.join("\n")} end } self.class.class_eval(class_def) flexmock(self.class.const_get(class_name).alloc.init) end