Module: Prezzo::Explainable::ClassMethods

Defined in:
lib/prezzo/explainable.rb

Instance Method Summary collapse

Instance Method Details

#explain_with(*component_names) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/prezzo/explainable.rb', line 10

def explain_with(*component_names)
  define_method(:explain) do
    explanation = {
      total: calculate,
    }

    components = component_names.each_with_object({}) do |component, acc|
      value = send(component)
      if self.class.respond_to?(:components) && self.class.components.include?(component)
        value = cached_components[component]
      end
      value = value.explain if value.respond_to?(:explain)
      value = value.calculate if value.respond_to?(:calculate)
      acc[component] = value
    end

    explanation[:components] = components unless components.empty?

    explanation
  end
end