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