def evaluate(node, attrs, params = {})
      raise 'bad params' unless params.is_a?(Hash)

      if node.is_a?(Class)
        klass = node
      else
        raise "bad node '#{node}'" unless node =~ /^[A-Z][a-zA-Z0-9_]*$/

        begin
          klass = @m.module_eval(node)
        rescue NameError
          err(UndefinedNodeError, "node #{node} is undefined")
        end
      end

      params[:_engine] = self

      type_arr = attrs.is_a?(Array)
      attrs = [attrs] unless type_arr

      res = attrs.map do |attr|
        raise "bad attribute '#{attr}'" unless attr =~ /^[a-z][A-Za-z0-9_]*$/

        klass.send("#{attr}#{POST}".to_sym, params)
      end
      type_arr ? res : res[0]
    end
def evaluate(node, attrs, params = {})
      raise 'bad params' unless params.is_a?(Hash)

      if node.is_a?(Class)
        klass = node
      else
        raise "bad node '#{node}'" unless node =~ /^[A-Z][a-zA-Z0-9_]*$/

        begin
          klass = @m.module_eval(node)
        rescue NameError
          err(UndefinedNodeError, "node #{node} is undefined")
        end
      end

      params[:_engine] = self

      type_arr = attrs.is_a?(Array)
      attrs = [attrs] unless type_arr

      res = attrs.map do |attr|
        raise "bad attribute '#{attr}'" unless attr =~ /^[a-z][A-Za-z0-9_]*$/

        klass.send("#{attr}#{POST}".to_sym, params)
      end
      type_arr ? res : res[0]
    end
Runtime