Class: Puppet::Pops::Functions::Dispatch Private

Inherits:
Evaluator::CallableSignature show all
Defined in:
lib/puppet/pops/functions/dispatch.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

API:

  • private

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Evaluator::CallableSignature

#args_range, #block_range, #block_type, #infinity?

Constructor Details

#initialize(type, method_name, param_names, block_name, injections, weaving, last_captures) ⇒ Dispatch

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Dispatch.

API:

  • private



25
26
27
28
29
30
31
32
33
# File 'lib/puppet/pops/functions/dispatch.rb', line 25

def initialize(type, method_name, param_names, block_name, injections, weaving, last_captures)
  @type = type
  @method_name = method_name
  @param_names = param_names || []
  @block_name = block_name
  @injections = injections || []
  @weaving = weaving
  @last_captures = last_captures
end

Instance Attribute Details

#block_nameObject (readonly)

API:

  • public



22
23
24
# File 'lib/puppet/pops/functions/dispatch.rb', line 22

def block_name
  @block_name
end

#injectionsObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



15
16
17
# File 'lib/puppet/pops/functions/dispatch.rb', line 15

def injections
  @injections
end

#param_namesObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

TODO: refactor to parameter_names since that makes it API

API:

  • private



14
15
16
# File 'lib/puppet/pops/functions/dispatch.rb', line 14

def param_names
  @param_names
end

#typeObject (readonly)

API:

  • public



12
13
14
# File 'lib/puppet/pops/functions/dispatch.rb', line 12

def type
  @type
end

#weavingObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Describes how arguments are woven if there are injections, a regular argument is a given arg index, an array an injection description.

API:

  • private



20
21
22
# File 'lib/puppet/pops/functions/dispatch.rb', line 20

def weaving
  @weaving
end

Instance Method Details

#invoke(instance, calling_scope, args, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



46
47
48
49
50
51
# File 'lib/puppet/pops/functions/dispatch.rb', line 46

def invoke(instance, calling_scope, args, &block)
  result = instance.send(@method_name, *weave(calling_scope, args), &block)
  return_type = @type.return_type
  Types::TypeAsserter.assert_instance_of(nil, return_type, result) { "value returned from function '#{@method_name}'" } unless return_type.nil?
  result
end

#last_captures_rest?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

API:

  • private



41
42
43
# File 'lib/puppet/pops/functions/dispatch.rb', line 41

def last_captures_rest?
  !! @last_captures
end

#parameter_namesObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



36
37
38
# File 'lib/puppet/pops/functions/dispatch.rb', line 36

def parameter_names
  @param_names
end

#weave(scope, args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/puppet/pops/functions/dispatch.rb', line 54

def weave(scope, args)
  # no need to weave if there are no injections
  if @injections.empty?
    args
  else
    injector = nil # lazy lookup of injector Puppet.lookup(:injector)
    new_args = []
    @weaving.each do |knit|
      if knit.is_a?(Array)
        injection_data = @injections[knit[0]]
        new_args <<
          case injection_data[3]
          when :dispatcher_internal
            # currently only supports :scope injection
            scope
          when :producer
            injector ||= Puppet.lookup(:injector)
            injector.lookup_producer(scope, injection_data[0], injection_data[2])
          else
            injector ||= Puppet.lookup(:injector)
            injector.lookup(scope, injection_data[0], injection_data[2])
          end
      else
        # Careful so no new nil arguments are added since they would override default
        # parameter values in the received
        if knit < 0
          idx = -knit - 1
          new_args += args[idx..-1] if idx < args.size
        else
          new_args << args[knit] if knit < args.size
        end
      end
    end
    new_args
  end
end