292: def enhance_with_matching_rule(task_name, level=0)
293: fail Rake::RuleRecursionOverflowError,
294: "Rule Recursion Too Deep" if level >= 16
295: RULES.each do |pattern, extensions, block|
296: if md = pattern.match(task_name)
297: ext = extensions.first
298: case ext
299: when String
300: source = task_name.sub(/\.[^.]*$/, ext)
301: when Proc
302: source = ext.call(task_name)
303: else
304: fail "Don't know how to handle rule dependent: #{ext.inspect}"
305: end
306: if File.exist?(source) || Task.task_defined?(source)
307: task = FileTask.define_task({task_name => [source]}, &block)
308: task.source = source
309: return task
310: elsif parent = enhance_with_matching_rule(source, level+1)
311: task = FileTask.define_task({task_name => [parent.name]}, &block)
312: task.source = parent.name
313: return task
314: end
315: end
316: end
317: nil
318: rescue Rake::RuleRecursionOverflowError => ex
319: ex.add_target(task_name)
320: fail ex
321: end