Class: Puppet::Pops::Loader::RubyFunctionInstantiator
- Defined in:
- lib/puppet/pops/loader/ruby_function_instantiator.rb
Overview
The RubyFunctionInstantiator instantiates a Puppet::Functions::Function given the ruby source that calls Puppet::Functions.create_function.
Class Method Summary collapse
-
.create(loader, typed_name, source_ref, ruby_code_string) ⇒ Puppet::Pops::Functions.Function
Produces an instance of the Function class with the given typed_name, or fails with an error if the given ruby source does not produce this instance when evaluated.
Class Method Details
.create(loader, typed_name, source_ref, ruby_code_string) ⇒ Puppet::Pops::Functions.Function
Produces an instance of the Function class with the given typed_name, or fails with an error if the given ruby source does not produce this instance when evaluated.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/puppet/pops/loader/ruby_function_instantiator.rb', line 15 def self.create(loader, typed_name, source_ref, ruby_code_string) unless ruby_code_string.is_a?(String) && ruby_code_string =~ /Puppet\:\:Functions\.create_function/ raise ArgumentError, "The code loaded from #{source_ref} does not seem to be a Puppet 4x API function - no create_function call." end created = eval(ruby_code_string, nil, source_ref, 1) unless created.is_a?(Class) raise ArgumentError, "The code loaded from #{source_ref} did not produce a Function class when evaluated. Got '#{created.class}'" end unless created.name.to_s == typed_name.name() raise ArgumentError, "The code loaded from #{source_ref} produced mis-matched name, expected '#{typed_name.name}', got #{created.name}" end # create the function instance - it needs closure (scope), and loader (i.e. where it should start searching for things # when calling functions etc. # It should be bound to global scope # TODO: Cheating wrt. scope - assuming it is found in the context closure_scope = Puppet.lookup(:global_scope) { {} } created.new(closure_scope, loader.private_loader) end |