Class: Transitions::Machine

Inherits:
Object
  • Object
show all
Defined in:
lib/transitions/machine.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass, options = {}, &block) ⇒ Machine

Returns a new instance of Machine.


7
8
9
10
# File 'lib/transitions/machine.rb', line 7

def initialize(klass, options = {}, &block)
  @klass, @states, @state_index, @events = klass, [], {}, {}
  update(options, &block)
end

Instance Attribute Details

#auto_scopesObject (readonly)

Returns the value of attribute auto_scopes


5
6
7
# File 'lib/transitions/machine.rb', line 5

def auto_scopes
  @auto_scopes
end

#eventsObject

Returns the value of attribute events


4
5
6
# File 'lib/transitions/machine.rb', line 4

def events
  @events
end

#initial_stateObject


12
13
14
# File 'lib/transitions/machine.rb', line 12

def initial_state
  @initial_state ||= (states.first ? states.first.name : nil)
end

#klassObject (readonly)

Returns the value of attribute klass


5
6
7
# File 'lib/transitions/machine.rb', line 5

def klass
  @klass
end

#state_indexObject

Returns the value of attribute state_index


4
5
6
# File 'lib/transitions/machine.rb', line 4

def state_index
  @state_index
end

#statesObject

Returns the value of attribute states


4
5
6
# File 'lib/transitions/machine.rb', line 4

def states
  @states
end

Instance Method Details

#current_state_variableObject


51
52
53
54
# File 'lib/transitions/machine.rb', line 51

def current_state_variable
  # TODO Refactor me away.
  :@current_state
end

#events_for(state) ⇒ Object


46
47
48
49
# File 'lib/transitions/machine.rb', line 46

def events_for(state)
  events = @events.values.select { |event| event.transitions_from_state?(state) }
  events.map!(&:name)
end

#fire_event(event, record, persist, *args) ⇒ Object

TODO There is still way to much parameter passing around going on down below.


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/transitions/machine.rb', line 25

def fire_event(event, record, persist, *args)
  handle_state_exit_callback record
  if new_state = transition_to_new_state(record, event, *args)
    handle_state_enter_callback record, new_state
    handle_event_fired_callback record, new_state, event
    record.update_current_state(new_state, persist)
    handle_event_success_callback record, event
    return true
  else
    handle_event_failed_callback record, event
    return false
  end
rescue => e
  if record.respond_to?(:event_failed)
    record.send(:event_failed, event)
    return false
  else
    raise e
  end
end

#update(options = {}, &block) ⇒ Object


16
17
18
19
20
21
22
# File 'lib/transitions/machine.rb', line 16

def update(options = {}, &block)
  @initial_state = options[:initial] if options.key?(:initial)
  @auto_scopes = options[:auto_scopes]
  instance_eval(&block) if block
  include_scopes if @auto_scopes && ::Transitions.active_model_descendant?(klass)
  self
end