class RGen::Environment
An Environment is used to hold model elements.
Public Class Methods
# File lib/rgen/environment.rb, line 7 def initialize @elements = {} @subClasses = {} @subClassesUpdated = {} @deleted = {} @deletedClasses = {} end
Public Instance Methods
Add a model element. Returns the environment so <<
can
be chained.
# File lib/rgen/environment.rb, line 17 def <<(el) clazz = el.class @elements[clazz] ||= [] @elements[clazz] << el updateSubClasses(clazz) self end
Removes model element from environment.
# File lib/rgen/environment.rb, line 26 def delete(el) @deleted[el] = true @deletedClasses[el.class] = true end
Iterates each element
# File lib/rgen/environment.rb, line 33 def each(&b) removeDeleted @elements.values.flatten.each(&b) end
Return the elements of the environment as an array
# File lib/rgen/environment.rb, line 40 def elements removeDeleted @elements.values.flatten end
Finds and returns model elements in the environment.
The search description argument must be a hash specifying attribute/value pairs. Only model elements are returned which respond to the specified attribute methods and return the specified values as result of these attribute methods.
As a special hash key :class can be used to look for model elements of a specific class. In this case an array of possible classes can optionally be given.
# File lib/rgen/environment.rb, line 63 def find(desc) removeDeleted result = [] classes = desc[:class] if desc[:class] and desc[:class].is_a?(Array) classes = [ desc[:class] ] if !classes and desc[:class] if classes hashKeys = classesWithSubClasses(classes) else hashKeys = @elements.keys end hashKeys.each do |clazz| next unless @elements[clazz] @elements[clazz].each do |e| failed = false desc.each_pair { |k,v| failed = true if k != :class and ( !e.respond_to?(k) or e.send(k) != v ) } result << e unless failed end end result end
This method can be used to instantiate a class and automatically put it into the environment. The new instance is returned.
# File lib/rgen/environment.rb, line 48 def new(clazz, *args) obj = clazz.new(*args) self << obj obj end
Private Instance Methods
# File lib/rgen/environment.rb, line 111 def classesWithSubClasses(classes) result = classes classes.each do |c| result += @subClasses[c] if @subClasses[c] end result.uniq end
# File lib/rgen/environment.rb, line 88 def removeDeleted @deletedClasses.keys.each do |c| @elements[c].reject!{|e| @deleted[e]} end @deletedClasses.clear @deleted.clear end
# File lib/rgen/environment.rb, line 119 def superclasses(clazz) if clazz == Object [] else superclasses(clazz.superclass) << clazz.superclass end end
# File lib/rgen/environment.rb, line 96 def updateSubClasses(clazz) return if @subClassesUpdated[clazz] if clazz.respond_to?( :ecore ) superClasses = clazz.ecore.eAllSuperTypes.collect{|c| c.instanceClass} else superClasses = superclasses(clazz) end superClasses.each do |c| next if c == Object @subClasses[c] ||= [] @subClasses[c] << clazz end @subClassesUpdated[clazz] = true end