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



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

def ignore_method_conflicts
  @ignore_method_conflicts
end

#rendererObject



72
73
74
75
76
# File 'lib/state_machines/machine/class_methods.rb', line 72

def renderer
  return @renderer if @renderer

  STDIORenderer
end

Instance Method Details

#default_messagesObject



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

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

#default_messages=(messages) ⇒ Object



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

def default_messages=(messages)
  @default_messages = 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, &block) ⇒ 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, &block)
  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(&block) if block_given?
  else
    # No existing machine: create a new one
    machine = new(owner_class, name, options, &block)
  end

  machine
end

#replace_messages(message_hash) ⇒ Object



64
65
66
67
68
# File 'lib/state_machines/machine/class_methods.rb', line 64

def replace_messages(message_hash)
  message_hash.each do |key, value|
    default_messages[key] = value
  end
end