1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'spec'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/template'
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/util'
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinclude ANTLR3
9324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverMethodDescription = Struct.new( :name, :body, :arguments )
10324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTEMPLATE_NAMES = %w( method class_definition attribute )
11324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverSAMPLE_GROUP_FILE = File.join(
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  File.dirname( __FILE__ ), 'sample-input', 'template-group'
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver)
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdescribe Template::Context do
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "creating an empty context" do
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context = Template::Context.new
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variables.should be_empty
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "creating a context with a variable map" do
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context = Template::Context.new(
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :a => 1, :b => 2
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vars = context.instance_variables.map { | i | i.to_s }
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vars.should include( '@a' )
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vars.should include( '@b' )
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variable_get( '@a' ).should == 1
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variable_get( '@b' ).should == 2
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "fetching variable values from []" do
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context = Template::Context.new(
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :a => 1, :b => 2
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context[ :a ].should == 1
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context[ 'a' ].should == 1
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context[ :b ].should == 2
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context[ 'b' ].should == 2
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "defining variables with []=" do
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context = Template::Context.new( :a => 3 )
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context[ :a ] = 1
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context[ 'b' ] = 2
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variable_get( '@a' ).should == 1
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variable_get( '@b' ).should == 2
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "using method missing to assign values" do
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context = Template::Context.new( :a => 3 )
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.a = 1
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.b = 2
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variable_get( '@a' ).should == 1
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.instance_variable_get( '@b' ).should == 2
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "using method missing to get variable values" do
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context = Template::Context.new( :a => 1, :b => 2)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.a.should == 1
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    context.b.should == 2
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvershared_examples_for "template groups" do
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include ANTLR3::Util
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "template definitions" do
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    templates = @group.templates
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    templates.should_not be_empty
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    templates.should equal @group::TEMPLATES
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    names = templates.keys
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    names.should have(3).things
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for template_name in TEMPLATE_NAMES
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      names.should include template_name
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      template_class = templates[ template_name ]
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      template_class.should be_a_kind_of Class
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      template_class.superclass.should equal Template::Context
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      template_class.should be < @group # it should include the group module
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "template_defined?( name ) should verify whether a template is defined in a group" do
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for name in TEMPLATE_NAMES
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @group.template_defined?( name ).should be_true
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @group.template_defined?( name.to_s ).should be_true
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @group.template_defined?( :something_else ).should be_false
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "template method definitions" do
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    for name in TEMPLATE_NAMES
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @group.should respond_to( name )
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @group.should respond_to( "#{ name }!" )
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      if RUBY_VERSION =~ /^1\.9/
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @group.private_instance_methods.should include name.to_sym
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @group.private_instance_methods.should include :"#{ name }!"
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      else
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @group.private_instance_methods.should include name.to_s
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @group.private_instance_methods.should include "#{ name }!"
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "template method operation" do
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value = @group.class_definition
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value.should be_a_kind_of Template::Context
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value = @group.class_definition!
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value.should be_a_kind_of String
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value = @group.attribute( :name => 'a' )
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    value.should be_a_kind_of Template::Context
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdescribe Template::Group, "dynamic template definition" do
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  include ANTLR3::Util
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  before :each do
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @group = Template::Group.new do
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      extend ANTLR3::Util
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      define_template( :class_definition, tidy( <<-'END'.chomp ) )
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | class <%= @name %><% if @superclass %> < <%= @superclass %><% end %>
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % if @attributes
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | 
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % for attr, access in @attributes 
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | <%= attribute( :name => attr, :access => ( access || 'rw' ) ).to_s.chomp %>
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % end
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % end
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % if @methods
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % for method in ( @methods || [] )
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | <%= method( method ) %>
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % end
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % end
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | end
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      define_template( :attribute, tidy( <<-'END'.chomp ) )
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % case @access.to_s.downcase
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % when 'r'
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      |   attr_reader :<%= @name %>
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % when 'w'
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      |   attr_writer :<%= @name %>
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % else
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      |   attr_accessor :<%= @name %>
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | % end
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      define_template( :method, tidy( <<-'END'.chomp ) )
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      |   
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      |   def <%= @name %><% if @arguments and not @arguments.empty? %>( <%= @arguments.join( ', ' ) %> )<% end %>
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      | <%= @body.gsub( /^/, '    ' ) %>
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      |   end
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      END
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  it_should_behave_like "template groups"
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "template object string rendering" do
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    attributes = [
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      %w( family ),
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      %w( name r )
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    methods = [
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MethodDescription.new( 'eat', %q[puts( "ate %s %s" % [ number, @name ] )], %w( number ) ),
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MethodDescription.new( :to_s, '@name.to_s.dup' )
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vegetable = @group.class_definition(
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :name => 'Vegetable',
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :superclass => 'Food',
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :attributes => attributes,
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :methods => methods
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vegetable.to_s.should == tidy( <<-END.chomp )
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    | class Vegetable < Food
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   attr_accessor :family
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   attr_reader :name
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   def eat( number )
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |     puts( "ate %s %s" % [ number, @name ] )
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   end
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   def to_s
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |     @name.to_s.dup
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   end
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    | end
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdescribe Template::Group, "loading a template definition file" do
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  before :each do
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @group = Template::Group.load( SAMPLE_GROUP_FILE )
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  it_should_behave_like "template groups"
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "template object string rendering" do
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    attributes = [
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      %w( family ),
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      %w( name r )
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    methods = [
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MethodDescription.new( 'eat', %q[puts( "ate %s %s" % [ number, @name ] )], %w( number ) ),
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      MethodDescription.new( :to_s, '@name.to_s.dup' )
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ]
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vegetable = @group.class_definition(
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :name => 'Vegetable',
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :superclass => 'Food',
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :attributes => attributes,
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      :methods => methods
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    vegetable.to_s.should == tidy( <<-END.chomp )
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    | class Vegetable < Food
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   attr_accessor :family
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   attr_reader :name
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   def eat( number )
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |     puts( "ate %s %s" % [ number, @name ] )
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   end
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   def to_s
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |     @name.to_s.dup
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    |   end
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    | end
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
251