Module: StateMachines::Machine::ClassMethods

Included in:
StateMachines::Machine
Defined in:
lib/state_machines/machine/class_methods.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#ignore_method_conflictsObject

Default messages to use for validation errors in ORM integrations Thread-safe access via atomic operations on simple values



51
52
53
# File 'lib/state_machines/machine/class_methods.rb', line 51

def ignore_method_conflicts
  @ignore_method_conflicts
end

#rendererObject



75
76
77
78
79
# File 'lib/state_machines/machine/class_methods.rb', line 75

def renderer
  return @renderer if @renderer

  STDIORenderer
end

Instance Method Details

#default_messagesObject



53
54
55
56
57
58
59
# File 'lib/state_machines/machine/class_methods.rb', line 53

def default_messages
  @default_messages ||= {
    invalid: 'is invalid',
    invalid_event: 'cannot transition when %s',
    invalid_transition: 'cannot transition via "%1$s"'
  }.freeze
end

#default_messages=(messages) ⇒ Object



61
62
63
64
# File 'lib/state_machines/machine/class_methods.rb', line 61

def default_messages=(messages)
  # Atomic replacement with frozen object
  @default_messages = deep_freeze_hash(messages)
end

#drawObject

Raises:

  • (NotImplementedError)


45
46
47
# File 'lib/state_machines/machine/class_methods.rb', line 45

def draw(*)
  raise NotImplementedError
end

#find_or_create(owner_class, *args) ⇒ Object

Attempts to find or create a state machine for the given class. For example,

StateMachines::Machine.find_or_create(Vehicle)
StateMachines::Machine.find_or_create(Vehicle, :initial => :parked)
StateMachines::Machine.find_or_create(Vehicle, :status)
StateMachines::Machine.find_or_create(Vehicle, :status, :initial => :parked)

If a machine of the given name already exists in one of the class’s superclasses, then a copy of that machine will be created and stored in the new owner class (the original will remain unchanged).



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/state_machines/machine/class_methods.rb', line 17

def find_or_create(owner_class, *args, &)
  options = args.last.is_a?(Hash) ? args.pop : {}
  name = args.first || :state

  # Find an existing machine
  machine = (owner_class.respond_to?(:state_machines) &&
            ((args.first && owner_class.state_machines[name]) || (!args.first &&
            owner_class.state_machines.values.first))) || nil

  if machine
    # Only create a new copy if changes are being made to the machine in
    # a subclass
    if machine.owner_class != owner_class && (options.any? || block_given?)
      machine = machine.clone
      machine.initial_state = options[:initial] if options.include?(:initial)
      machine.owner_class = owner_class
    end

    # Evaluate DSL
    machine.instance_eval(&) if block_given?
  else
    # No existing machine: create a new one
    machine = new(owner_class, name, options, &)
  end

  machine
end

#replace_messages(message_hash) ⇒ Object



66
67
68
69
70
71
# File 'lib/state_machines/machine/class_methods.rb', line 66

def replace_messages(message_hash)
  # Atomic replacement: read current messages, merge with new ones, replace atomically
  current_messages = @default_messages || {}
  merged_messages = current_messages.merge(message_hash)
  @default_messages = deep_freeze_hash(merged_messages)
end