1#!/usr/bin/ruby
2
3module ANTLR3
4module Template
5Parameter = Struct.new( :name, :default )
6class Parameter
7  def to_s
8    if block then "&#{ name }"
9    elsif splat then "*#{ name }"
10    elsif default then "#{ name } = #{ default }"
11    else name.dup
12    end
13  end
14end
15
16class ParameterList < ::Array
17  attr_accessor :splat, :block
18  
19  def self.default
20    new.add( :values ) do | p |
21      p.default = '{}'
22    end
23  end
24  
25  def names
26    names = map { | param | param.name.to_s }
27    @splat and names << @splat.to_s
28    @block and names << @block.to_s
29    return( names )
30  end
31  
32  def add( name, default = nil )
33    param =
34      case name
35      when Parameter then name
36      else Parameter.new( name.to_s )
37      end
38    if options
39      default = options[ :default ] and param.default = default
40      param.splat = options.fetch( :splat, false )
41      param.block = options.fetch( :block, false )
42    end
43    block_given? and yield( param )
44    push( param )
45    return( self )
46  end
47  
48  def to_s
49    signature = join( ', ' )
50    @splat and signature << ", *" << @splat.to_s
51    @block and signature << ", &" << @block.to_s
52    return( signature )
53  end
54end
55end
56end
57