class AASM::Core::Invoker

main invoker class which encapsulates the logic for invoking literal-based, proc-based, class-based and array-based callbacks for different entities.

Constants

DEFAULT_RETURN_VALUE

Attributes

args[R]

rubocop:enable Metrics/AbcSize

default_return_value[R]

rubocop:enable Metrics/AbcSize

failures[R]

rubocop:enable Metrics/AbcSize

options[R]

rubocop:enable Metrics/AbcSize

record[R]

rubocop:enable Metrics/AbcSize

subject[R]

rubocop:enable Metrics/AbcSize

Public Class Methods

new(subject, record, args) click to toggle source

Initialize a new invoker instance. NOTE that invoker must be used per-subject/record

(one instance per subject/record)

Options:

subject - invoking subject, may be Proc,

Class, String, Symbol or Array

record - invoking record args - arguments which will be passed to the callback

# File lib/aasm/core/invoker.rb, line 24
def initialize(subject, record, args)
  @subject = subject
  @record = record
  @args = args
  @options = {}
  @failures = []
  @default_return_value = DEFAULT_RETURN_VALUE
end

Public Instance Methods

invoke() click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/aasm/core/invoker.rb, line 83
def invoke
  return invoke_array if subject.is_a?(Array)
  return literal_invoker.invoke if literal_invoker.may_invoke?
  return proc_invoker.invoke if proc_invoker.may_invoke?
  return class_invoker.invoke if class_invoker.may_invoke?
  default_return_value
end
with_default_return_value(value) click to toggle source

Change default return value of invoke method if none of invokers processed the request.

The default return value is DEFAULT_RETURN_VALUE

Options:

value - default return value for invoke method

# File lib/aasm/core/invoker.rb, line 72
def with_default_return_value(value)
  @default_return_value = value
  self
end
with_failures(failures) click to toggle source

Collect failures to a specified buffer

Options:

failures - failures buffer to collect failures

# File lib/aasm/core/invoker.rb, line 57
def with_failures(failures)
  @failures = failures
  self
end
with_options(options) click to toggle source

Pass additional options to concrete invoker

Options:

options - hash of options which will be passed to

concrete invokers

Example:

with_options(guard: proc {…})

# File lib/aasm/core/invoker.rb, line 45
def with_options(options)
  @options = options
  self
end

Private Instance Methods

class_invoker() click to toggle source
# File lib/aasm/core/invoker.rb, line 116
def class_invoker
  @class_invoker ||= Invokers::ClassInvoker
                     .new(subject, record, args)
                     .with_failures(failures)
end
invoke_array() click to toggle source
# File lib/aasm/core/invoker.rb, line 97
def invoke_array
  return subject.all? { |item| sub_invoke(item) } if options[:guard]
  return subject.all? { |item| !sub_invoke(item) } if options[:unless]
  subject.map { |item| sub_invoke(item) }
end
literal_invoker() click to toggle source
# File lib/aasm/core/invoker.rb, line 122
def literal_invoker
  @literal_invoker ||= Invokers::LiteralInvoker
                       .new(subject, record, args)
                       .with_failures(failures)
end
proc_invoker() click to toggle source
# File lib/aasm/core/invoker.rb, line 110
def proc_invoker
  @proc_invoker ||= Invokers::ProcInvoker
                    .new(subject, record, args)
                    .with_failures(failures)
end
sub_invoke(new_subject) click to toggle source
# File lib/aasm/core/invoker.rb, line 103
def sub_invoke(new_subject)
  self.class.new(new_subject, record, args)
      .with_failures(failures)
      .with_options(options)
      .invoke
end