def _build_many_methods(props, other_props=nil)
name = props.value(:name)
other_role = other_props && other_props.value(:name)
if props.value(:derived)
build_derived_method(name, props, :many)
else
@@many_read_builder ||= ERB.new "\ndef get<%= firstToUpper(name) %>\n( @<%= name %> ? @<%= name %>.dup : [] )\nend\n<% if name != \"class\" %>\nalias <%= name %> get<%= firstToUpper(name) %>\n<% end %>\n\n"
self::ClassModule.module_eval(@@many_read_builder.result(binding))
end
if props.value(:changeable)
@@many_write_builder ||= ERB.new "\ndef add<%= firstToUpper(name) %>(val, index=-1)\n@<%= name %> = [] unless @<%= name %>\nreturn if val.nil? || (@<%= name %>.any?{|e| e.object_id == val.object_id} && (val.is_a?(MMBase) || val.is_a?(MMGeneric)))\n<%= type_check_code(\"val\", props) %>\n@<%= name %>.insert(index, val)\n<% if other_role %>\nval._register<%= firstToUpper(other_role) %>(self) unless val.is_a?(MMGeneric)\n<% end %>\n<% if props.reference? && props.value(:containment) %>\nval._set_container(self, :<%= name %>)\n<% end %>\nend\n\ndef remove<%= firstToUpper(name) %>(val)\n@<%= name %> = [] unless @<%= name %>\n@<%= name %>.each_with_index do |e,i|\nif e.object_id == val.object_id\n@<%= name %>.delete_at(i)\n<% if props.reference? && props.value(:containment) %>\nval._set_container(nil, nil)\n<% end %>\n<% if other_role %>\nval._unregister<%= firstToUpper(other_role) %>(self) unless val.is_a?(MMGeneric)\n<% end %>\nreturn\nend\nend\nend\n\ndef set<%= firstToUpper(name) %>(val)\nreturn if val.nil?\nraise _assignmentTypeError(self, val, Enumerable) unless val.is_a? Enumerable\nget<%= firstToUpper(name) %>.each {|e|\nremove<%= firstToUpper(name) %>(e)\n}\nval.each {|v|\nadd<%= firstToUpper(name) %>(v)\n}\nend\nalias <%= name %>= set<%= firstToUpper(name) %>\n\ndef _register<%= firstToUpper(name) %>(val)\n@<%= name %> = [] unless @<%= name %>\n@<%= name %>.push val\n<% if props.reference? && props.value(:containment) %>\nval._set_container(self, :<%= name %>)\n<% end %>\nend\n\ndef _unregister<%= firstToUpper(name) %>(val)\n@<%= name %>.delete val\n<% if props.reference? && props.value(:containment) %>\nval._set_container(nil, nil)\n<% end %>\nend\n\n"
self::ClassModule.module_eval(@@many_write_builder.result(binding))
end
end