Class: ClosedLoop::Machine::Instance

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/closed_loop/machine/instance.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeInstance

Returns a new instance of Instance.



12
13
14
15
16
# File 'lib/closed_loop/machine/instance.rb', line 12

def initialize
  @configuration = ClosedLoop::Machine::Configuration.new(self)

  configure_all
end

Instance Attribute Details

#configurationObject (readonly)

Returns the value of attribute configuration.



8
9
10
# File 'lib/closed_loop/machine/instance.rb', line 8

def configuration
  @configuration
end

Instance Method Details

#available_transitions(target, user) ⇒ Object



18
19
20
# File 'lib/closed_loop/machine/instance.rb', line 18

def available_transitions(target, user)
  configuration.transitions.select { |transition| transition.available?(target, user) }
end

#configure_allObject



48
49
50
# File 'lib/closed_loop/machine/instance.rb', line 48

def configure_all
  raise '#configure_all not implemented yet'
end

#resolve_role(*args) ⇒ Object



44
45
46
# File 'lib/closed_loop/machine/instance.rb', line 44

def resolve_role(*args)
  self.class.const_get('RoleResolver').new(*args).call
end

#transit(target, user, to:, attributes: {}, &block) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/closed_loop/machine/instance.rb', line 34

def transit(target, user, to:, attributes: {}, &block)
  available_transition = available_transitions(target, user).find do |transition|
    transition.from == target.status.to_sym && transition.to == to.to_sym
  end

  if available_transition&.available?(target, user)
    available_transition.perform(target, user, attributes, &block)
  end
end

#transit!(target, user, to:, &block) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/closed_loop/machine/instance.rb', line 22

def transit!(target, user, to:, &block)
  available_transition = available_transitions(target, user).find do |transition|
    transition.from == target.status.to_sym && transition.to == to.to_sym
  end

  if available_transition&.available?(target, user)
    available_transition.perform!(target, user, &block)
  else
    raise("Transition #{self.class} #{target.status}->#{to} for #{target.id} by #{user} not available!")
  end
end