1module Rake 2 3 #################################################################### 4 # TaskArguments manage the arguments passed to a task. 5 # 6 class TaskArguments 7 include Enumerable 8 9 attr_reader :names 10 11 # Create a TaskArgument object with a list of named arguments 12 # (given by :names) and a set of associated values (given by 13 # :values). :parent is the parent argument object. 14 def initialize(names, values, parent=nil) 15 @names = names 16 @parent = parent 17 @hash = {} 18 names.each_with_index { |name, i| 19 @hash[name.to_sym] = values[i] unless values[i].nil? 20 } 21 end 22 23 # Create a new argument scope using the prerequisite argument 24 # names. 25 def new_scope(names) 26 values = names.collect { |n| self[n] } 27 self.class.new(names, values, self) 28 end 29 30 # Find an argument value by name or index. 31 def [](index) 32 lookup(index.to_sym) 33 end 34 35 # Specify a hash of default values for task arguments. Use the 36 # defaults only if there is no specific value for the given 37 # argument. 38 def with_defaults(defaults) 39 @hash = defaults.merge(@hash) 40 end 41 42 def each(&block) 43 @hash.each(&block) 44 end 45 46 def values_at(*keys) 47 keys.map { |k| lookup(k) } 48 end 49 50 def method_missing(sym, *args) 51 lookup(sym.to_sym) 52 end 53 54 def to_hash 55 @hash 56 end 57 58 def to_s 59 @hash.inspect 60 end 61 62 def inspect 63 to_s 64 end 65 66 protected 67 68 def lookup(name) 69 if @hash.has_key?(name) 70 @hash[name] 71 elsif @parent 72 @parent.lookup(name) 73 end 74 end 75 end 76 77 EMPTY_TASK_ARGS = TaskArguments.new([], []) 78end 79