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.

Defines a connection between a implementation method and the signature that the method will handle.

This interface should not be used directly. Instead dispatches should be constructed using the DSL defined in Functions.

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



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

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



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

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



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

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



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

def param_names
  @param_names
end

#typeObject (readonly)

API:

  • public



10
11
12
# File 'lib/puppet/pops/functions/dispatch.rb', line 10

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



18
19
20
# File 'lib/puppet/pops/functions/dispatch.rb', line 18

def weaving
  @weaving
end

Instance Method Details

#invoke(instance, calling_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



44
45
46
# File 'lib/puppet/pops/functions/dispatch.rb', line 44

def invoke(instance, calling_scope, args)
  instance.send(@method_name, *weave(calling_scope, args))
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



39
40
41
# File 'lib/puppet/pops/functions/dispatch.rb', line 39

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



34
35
36
# File 'lib/puppet/pops/functions/dispatch.rb', line 34

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



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/puppet/pops/functions/dispatch.rb', line 49

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)
    weaving.map do |knit|
      if knit.is_a?(Array)
        injection_data = @injections[knit[0]]
        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
        # pick that argument (injection of static value)
        args[knit]
      end
    end
  end
end