class Puppet::Parser::AST::PopsBridge::Program

Bridges the top level “Program” produced by the pops parser. Its main purpose is to give one point where all definitions are instantiated (actually defined since the Puppet 3x terminology is somewhat misleading - the definitions are instantiated, but instances of the created types are not created, that happens when classes are included / required, nodes are matched and when resources are instantiated by a resource expression (which is also used to instantiate a host class).

Attributes

context[R]
program_model[R]

Public Instance Methods

each() { |self| ... } click to toggle source

Adapts to 3x where top level constructs needs to have each to iterate over children. Short circuit this by yielding self. This means that the HostClass container will call this bridge instance with `instantiate`.

# File lib/puppet/parser/ast/pops_bridge.rb, line 107
def each
  yield self
end
evaluate(scope) click to toggle source
# File lib/puppet/parser/ast/pops_bridge.rb, line 100
def evaluate(scope)
  @@evaluator.evaluate(scope, program_model)
end
instantiate(modname) click to toggle source

This is the 3x API, the 3x AST searches through all code to find the instructions that can be instantiated. This Pops-model based instantiation relies on the parser to build this list while parsing (which is more efficient as it avoids one full scan of all logic via recursive enumeration/yield)

# File lib/puppet/parser/ast/pops_bridge.rb, line 84
def instantiate(modname)
  @program_model.definitions.collect do |d|
    case d
    when Puppet::Pops::Model::HostClassDefinition
      instantiate_HostClassDefinition(d, modname)
    when Puppet::Pops::Model::ResourceTypeDefinition
      instantiate_ResourceTypeDefinition(d, modname)
    when Puppet::Pops::Model::NodeDefinition
      instantiate_NodeDefinition(d, modname)
    else
      raise Puppet::ParseError, "Internal Error: Unknown type of definition - got '#{d.class}'"
    end
  end.flatten().compact() # flatten since node definition may have returned an array
                          # Compact since functions are not understood by compiler
end

Public Class Methods

new(program_model, context = {}) click to toggle source
# File lib/puppet/parser/ast/pops_bridge.rb, line 73
def initialize(program_model, context = {})
  @program_model = program_model
  @context = context
  @ast_transformer ||= Puppet::Pops::Model::AstTransformer.new(@context[:file])
  @@evaluator ||= Puppet::Pops::Parser::EvaluatingParser.new()
end