254: def method_missing(meth, *args, &b)
255: STDERR.puts "Caesars.method_missing: #{meth}" if Caesars.debug?
256: add_known_symbol(meth)
257: if Caesars.forced_ignore?(meth)
258: STDERR.puts "Forced ignore: #{meth}" if Caesars.debug?
259: return
260: end
261:
262:
263: if meth.to_s =~ /=$/ && @caesars_properties.has_key?(meth.to_s.chop.to_sym)
264: return @caesars_properties[meth.to_s.chop.to_sym] = (args.size == 1) ? args.first : args
265: end
266:
267: return @caesars_properties[meth] if @caesars_properties.has_key?(meth) && args.empty? && b.nil?
268:
269:
270:
271:
272: if args.empty? && b.nil?
273:
274:
275: if Caesars.forced_array?(meth)
276: return @caesars_pointer[meth] ||= Caesars::Hash.new
277: else
278: return nil
279: end
280: end
281:
282: if b
283: if Caesars.forced_array?(meth)
284: @caesars_pointer[meth] ||= []
285: args << b
286: @caesars_pointer[meth] << args
287: else
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299: args << meth if args.empty?
300:
301: args.each do |name|
302: prev = @caesars_pointer
303: @caesars_pointer[name] ||= Caesars::Hash.new
304: if Caesars.chilled?(meth)
305: @caesars_pointer[name] = b
306: else
307: @caesars_pointer = @caesars_pointer[name]
308: begin
309: b.call if b
310: rescue ArgumentError, SyntaxError => ex
311: STDERR.puts "CAESARS: error in #{meth} (#{args.join(', ')})"
312: raise ex
313: end
314: @caesars_pointer = prev
315: end
316: end
317: end
318:
319:
320: elsif @caesars_pointer.kind_of?(Hash) && @caesars_pointer[meth]
321:
322: if Caesars.forced_array?(meth)
323: @caesars_pointer[meth] ||= []
324: @caesars_pointer[meth] << args
325: else
326:
327: unless @caesars_pointer[meth].is_a?(Array)
328: @caesars_pointer[meth] = [@caesars_pointer[meth]]
329: end
330: @caesars_pointer[meth] += args
331: end
332:
333: elsif !args.empty?
334: if Caesars.forced_array?(meth)
335: @caesars_pointer[meth] = [args]
336: else
337: @caesars_pointer[meth] = args.size == 1 ? args.first : args
338: end
339: end
340:
341: end