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