Module: Workflow::Join

Defined in:
lib/workflow/join.rb,
lib/workflow/join/simple.rb,
lib/workflow/join/version.rb,
lib/workflow/join/active_record.rb,
lib/workflow/join/simple/pending_callbacks.rb,
lib/workflow/join/simple/pending_transitions.rb,
lib/workflow/join/active_record/pending_callbacks.rb,
lib/workflow/join/active_record/pending_transitions.rb

Defined Under Namespace

Modules: ActiveRecord, Simple

Constant Summary collapse

GUARD_PARAMS_ERROR =
'Either guard instance variable name or a code block is required'.freeze
GUARD_POINTCUT_ERROR =
'Both :inner and :outer states are required'.freeze
GUARD_IS_NOT_WORKFLOW =
'Guard given must be a workflow instance, was: “%s”'.freeze
VERSION =
"0.2.1"

Instance Method Summary collapse

Instance Method Details

#guard(getter = nil, inner: nil, outer: nil) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/workflow/join.rb', line 92

def guard(getter = nil, inner: nil, outer: nil)
  fail Workflow::WorkflowDefinitionError, GUARD_PARAMS_ERROR unless !getter.nil? ^ block_given?
  fail Workflow::WorkflowDefinitionError, GUARD_POINTCUT_ERROR unless inner && outer

  guard = if block_given?
            Proc.new
          else
            g = getter.to_sym
            lambda do |host|
              case
              when /\A@/ =~ g.to_s && host.instance_variable_defined?(g)
                host.instance_variable_get(g)
              when host.methods.include?(g) && host.method(g).arity <= 0
                host.send g
              end.tap do |guard_instance|
                fail Workflow::WorkflowDefinitionError, GUARD_IS_NOT_WORKFLOW % guard_instance \
                  unless guard_instance.nil? || guard_instance.is_a?(Workflow)
              end
            end
          end
  (guards[inner.to_sym] ||= []) << [guard, outer.to_sym]
end

#guardsObject



88
89
90
# File 'lib/workflow/join.rb', line 88

def guards
  @guards ||= {}
end