<% 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 %>