def add_fields(*fieldsOrContainers)
@fieldsById=WriteOnceHash.new unless @fieldsById
@fieldsByName=WriteOnceHash.new unless @fieldsByName
@fields=[] unless @fields
fieldsOrContainers.each{ |fs|
raise ArgumentError,"An illegal class (#{fs.class}) was passed to add_fields; only the following classes are allowed: #{@allowed_container_classes.join(',')}" if @allowed_container_classes && (@allowed_container_classes & fs.class.ancestors).empty?
raise ArgumentError,"An illegal class (#{fs.class}) was passed to add_fields; the following classes may not be added: #{@disallowed_container_classes.join(',')}" if @disallowed_container_classes && !((@disallowed_container_classes & fs.class.ancestors).empty?)
raise ArgumentError,"You tried to add a container to itself. Are you trying to kill us all?" if fs==self
fs.parent_container=self if fs.respond_to?(:parent_container=)
@fieldsById[fs.id] = fs if fs.id
if fs.name
if !@fieldsByName[fs.name]
@fieldsByName[fs.name] = [fs]
else
@fieldsByName[fs.name] << fs
end
end
fs.everyField(true).each{ |f|
@fieldsById[f.id] = f if f.id
if f.name
if !@fieldsByName[f.name]
@fieldsByName[f.name] = [f]
else
@fieldsByName[f.name] << f
end
end
} if fs.respond_to?(:everyField)
}
@fields.push(*fieldsOrContainers)
@parent_container.subcontainer_changed if @parent_container
self
end