119: def flexmock(*args)
120: location = caller.first
121: name = nil
122: quick_defs = {}
123: domain_obj = nil
124: safe_mode = false
125: model_class = nil
126: base_class = nil
127: mock = nil
128: while ! args.empty?
129: case args.first
130: when :base, :safe
131: safe_mode = (args.shift == :safe)
132: domain_obj = args.shift
133: when :model
134: args.shift
135: model_class = args.shift
136: when :on
137: args.shift
138: base_class = args.shift
139: name ||= "#{base_class} Mock"
140: when String, Symbol
141: name = args.shift.to_s
142: when Hash
143: quick_defs = args.shift
144: when FlexMock
145: mock = args.shift
146: else
147: domain_obj = args.shift
148: end
149: end
150: raise UsageError, "a block is required in safe mode" if safe_mode && ! block_given?
151:
152: if domain_obj
153: mock = ContainerHelper.make_partial_proxy(self, domain_obj, name, safe_mode)
154: result = domain_obj
155: elsif model_class
156: id = ContainerHelper.next_id
157: mock ||= FlexMock.new("#{model_class}_#{id}", self)
158: result = mock
159: else
160: mock ||= FlexMock.new(name || "unknown", self)
161: result = mock
162: end
163: mock.flexmock_based_on(base_class) if base_class
164: mock.flexmock_define_expectation(location, quick_defs)
165: yield(mock) if block_given?
166: flexmock_remember(mock)
167: ContainerHelper.add_model_methods(mock, model_class, id, location) if model_class
168: result
169: end