Sha256: 24c95174c1d3602e880e629281735e87776c8206ce829fefd0be96d5c02a3668

Contents?: true

Size: 1.71 KB

Versions: 3

Compression:

Stored size: 1.71 KB

Contents

require_relative 'vocabulary'

module MiniKraken
  module Core
    class Environment
      include Vocabulary  # Use mix-in module

      # @return [Hash] Pairs of the kind {String => Variable}
      attr_reader :vars

      # @param aParent [Environment, NilClass] Parent environment to this one.
      def initialize(aParent = nil)
        init_vocabulary(aParent)
        @vars = {}
      end

      # @param aVariable [Variable]
      def add_var(aVariable)
        name = aVariable.name
        if vars.include?(name)
          err_msg = "Variable with name '#{name}' already exists."
          raise StandardError, err_msg
        end
        vars[name] = aVariable
      end

      # Handler for the event: an outcome has been produced.
      # Can be overridden in other to propagate associations from child
      # @param descendent [Outcome]
      def propagate(descendent)
        # Rollout associations from hierarchy
        walker = descendent.ancestor_walker
        begin
          env = walker.resume
          break if env.nil?
          env.do_propagate(descendent) if env.kind_of?(Environment) 
        end until env.equal?(self)
      end

      # Move associations from descendent outcome object
      def do_propagate(descendent)
        return unless descendent.successful? 

        vars.each_key do |var_name|
          assocs = descendent[var_name]
          assocs.each do |assoc|
            own = self[var_name]
            add_assoc(assoc) unless assoc.equal?(own)
          end
          descendent.associations.delete(var_name) unless assocs.empty?
        end
      end

      def merge_vars(descendent)
        descendent.vars.each_value { |vr| add_var(vr) }
      end
    end # class
  end # module
end # module

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
mini_kraken-0.1.04 lib/mini_kraken/core/environment.rb
mini_kraken-0.1.03 lib/mini_kraken/core/environment.rb
mini_kraken-0.1.02 lib/mini_kraken/core/environment.rb