<% define 'Annotations', :for => EPackage do %>
	<% for a in eAnnotations %>
		annotation <% expand 'AnnotationArgs', :for => a %>
	<% end %>
<% end %>

<% define 'Annotations', :for => EClass do %>
	<% for a in eAnnotations %>
		annotation <% expand 'AnnotationArgs', :for => a %>
	<% end %>
<% end %>

<% define 'Annotations', :for => EStructuralFeature do %>
	<% oppositeAnnotations = (this.respond_to?(:eOpposite) && eOpposite && eOpposite.eAnnotations) || [] %>
	<% if eAnnotations.size > 0 || oppositeAnnotations.size > 0 %>
		do<%iinc%>
			<% for a in eAnnotations %>
				annotation <% expand 'AnnotationArgs', :for => a %>
			<% end %>
			<% for a in oppositeAnnotations %>
				opposite_annotation <% expand 'AnnotationArgs', :for => a %>
			<% end %><%idec%>
		end<%nows%>
	<% end %>
<% end %>

<% define 'AnnotationArgs', :for => EAnnotation do %>
	<% if source.nil? %>
		<% expand 'Details' %>
	<% else %>
		:source => "<%= source.to_s %>", :details => {<% expand 'Details' %>}<%nows%>
	<% end %>
<% end %>

<% define 'Details', :for => EAnnotation do %>
	<%= details.sort{|a,b| a.key<=>b.key}.collect{ |d| "\'" + d.key + "\' => \'"+ (d.value || "").gsub('\'','\\\'').to_s + "\'"}.join(', ') %><%nows%>
<% end %>