class Puppet::Pops::Loader::DependencyLoader
DependencyLoader¶ ↑
This loader provides visibility into a set of other loaders. It is used as a child of a ModuleLoader (or other loader) to make its direct dependencies visible for loading from contexts that have access to this dependency loader. Access is typically given to logic that resides inside of the module, but not to those that just depend on the module.
It is instantiated with a name, and with a set of dependency_loaders.
@api private
Public Class Methods
Creates a DependencyLoader for one parent loader
@param parent_loader [Puppet::Pops::Loader] typically a module loader for the root @param name [String] the name of the dependency-loader (used for debugging and tracing only) @param dependency_loaders [Array<Puppet::Pops::Loader>] array of loaders for modules this module depends on
Puppet::Pops::Loader::BaseLoader::new
# File lib/puppet/pops/loader/dependency_loader.rb 18 def initialize(parent_loader, name, dependency_loaders, environment) 19 super(parent_loader, name, environment) 20 @dependency_loaders = dependency_loaders 21 end
Public Instance Methods
Puppet::Pops::Loader::BaseLoader#discover
# File lib/puppet/pops/loader/dependency_loader.rb 23 def discover(type, error_collector = nil, name_authority = Puppet::Pops::Pcore::RUNTIME_NAME_AUTHORITY, &block) 24 result = [] 25 @dependency_loaders.each { |loader| result.concat(loader.discover(type, error_collector, name_authority, &block)) } 26 result.concat(super) 27 result 28 end
Finds name in a loader this loader depends on / can see
# File lib/puppet/pops/loader/dependency_loader.rb 32 def find(typed_name) 33 if typed_name.qualified? 34 l = index()[typed_name.name_parts[0]] 35 if l 36 l.load_typed(typed_name) 37 else 38 # no module entered as dependency with name matching first segment of wanted name 39 nil 40 end 41 else 42 # a non name-spaced name, have to search since it can be anywhere. 43 # (Note: superclass caches the result in this loader as it would have to repeat this search for every 44 # lookup otherwise). 45 loaded = @dependency_loaders.reduce(nil) do |previous, loader| 46 break previous if !previous.nil? 47 loader.load_typed(typed_name) 48 end 49 if loaded 50 promote_entry(loaded) 51 end 52 loaded 53 end 54 end
@api public
Puppet::Pops::Loader::BaseLoader#loaded_entry
# File lib/puppet/pops/loader/dependency_loader.rb 58 def loaded_entry(typed_name, check_dependencies = false) 59 super || (check_dependencies ? loaded_entry_in_dependency(typed_name, check_dependencies) : nil) 60 end
# File lib/puppet/pops/loader/dependency_loader.rb 62 def to_s 63 "(DependencyLoader '#{@loader_name}' [" + @dependency_loaders.map {|loader| loader.to_s }.join(' ,') + "])" 64 end
Private Instance Methods
An index of module_name to module loader used to speed up lookup of qualified names
# File lib/puppet/pops/loader/dependency_loader.rb 89 def index 90 @index ||= @dependency_loaders.reduce({}) { |index, loader| index[loader.module_name] = loader; index } 91 end
# File lib/puppet/pops/loader/dependency_loader.rb 68 def loaded_entry_in_dependency(typed_name, check_dependencies) 69 if typed_name.qualified? 70 l = index[typed_name.name_parts[0]] 71 if l 72 l.loaded_entry(typed_name) 73 else 74 # no module entered as dependency with name matching first segment of wanted name 75 nil 76 end 77 else 78 # a non name-spaced name, have to search since it can be anywhere. 79 # (Note: superclass caches the result in this loader as it would have to repeat this search for every 80 # lookup otherwise). 81 @dependency_loaders.reduce(nil) do |previous, loader| 82 break previous if !previous.nil? 83 loader.loaded_entry(typed_name, check_dependencies) 84 end 85 end 86 end