Class: Puppet::Pops::Functions::Dispatcher Private
- Defined in:
- lib/puppet/pops/functions/dispatcher.rb
Overview
Instance Attribute Summary collapse
- #dispatchers ⇒ Object readonly private
Instance Method Summary collapse
-
#add(a_dispatch) ⇒ Object
private
Adds a dispatch directly to the set of dispathers.
-
#add_dispatch(type, method_name, param_names, block_name, injections, weaving, last_captures) ⇒ Object
private
Adds a regular dispatch for one method name.
-
#dispatch(instance, calling_scope, args, &block) ⇒ Object
private
Dispatches the call to the first found signature (entry with matching type).
-
#empty? ⇒ Boolean
private
Answers if dispatching has been defined.
-
#initialize ⇒ Dispatcher
constructor
private
A new instance of Dispatcher.
- #signatures ⇒ Object private
-
#to_type ⇒ Object
private
Produces a CallableType for a single signature, and a Variant otherwise.
Constructor Details
#initialize ⇒ Dispatcher
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 Dispatcher.
10 11 12 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 10 def initialize() @dispatchers = [ ] end |
Instance Attribute Details
#dispatchers ⇒ Object (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.
7 8 9 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 7 def dispatchers @dispatchers end |
Instance Method Details
#add(a_dispatch) ⇒ 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.
Adds a dispatch directly to the set of dispathers.
54 55 56 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 54 def add(a_dispatch) @dispatchers << a_dispatch end |
#add_dispatch(type, method_name, param_names, block_name, injections, weaving, last_captures) ⇒ 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.
Adds a regular dispatch for one method name
48 49 50 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 48 def add_dispatch(type, method_name, param_names, block_name, injections, weaving, last_captures) add(Puppet::Pops::Functions::Dispatch.new(type, method_name, param_names, block_name, injections, weaving, last_captures)) end |
#dispatch(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.
Dispatches the call to the first found signature (entry with matching type).
30 31 32 33 34 35 36 37 38 39 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 30 def dispatch(instance, calling_scope, args, &block) tc = Puppet::Pops::Types::TypeCalculator.singleton actual = tc.infer_set(block_given? ? args + [block] : args) found = @dispatchers.find { |d| tc.callable?(d.type, actual) } if found found.invoke(instance, calling_scope, args, &block) else raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(instance.class.name, @dispatchers, actual) end end |
#empty? ⇒ 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.
Answers if dispatching has been defined
18 19 20 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 18 def empty? @dispatchers.empty? end |
#signatures ⇒ 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.
73 74 75 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 73 def signatures @dispatchers end |
#to_type ⇒ 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.
Produces a CallableType for a single signature, and a Variant otherwise
61 62 63 64 65 66 67 68 69 70 |
# File 'lib/puppet/pops/functions/dispatcher.rb', line 61 def to_type() # make a copy to make sure it can be contained by someone else (even if it is not contained here, it # should be treated as immutable). # callables = dispatchers.map { | dispatch | dispatch.type } # multiple signatures, produce a Variant type of Callable1-n (must copy them) # single signature, produce single Callable callables.size > 1 ? Puppet::Pops::Types::TypeFactory.variant(*callables) : callables.pop end |