Module: StateAttr::ClassMethods

Defined in:
lib/state_attr.rb,
lib/state_attr/state.rb

Defined Under Namespace

Classes: State

Instance Method Summary collapse

Instance Method Details

#state_attr(attr, machine, options = {}, &block) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/state_attr.rb', line 5

def state_attr(attr, machine, options={}, &block)
  #attr, initial = attr
  self.send :define_method, attr do
    @state_handlers ||= {}
    @state_handlers[attr] ||= State.new(self, attr, machine, logger, options)
    @state_handlers[attr]
  end

  if options[:setter] == :exception
    self.send :define_method, "#{attr}=".to_sym do |state|
      raise "#{self.class.name} error, manual setting of state is not allowed (new value '#{state}')"
    end
  else
    self.send :define_method, "#{attr}=".to_sym do |state|
      @state_handlers ||= {}
      @state_handlers[attr] ||= State.new(self, attr, machine, logger, options)
      @state_handlers[attr].switch(state)
    end
  end

  if block_given?
    self.send :define_method, "on_#{attr}_change".to_sym, block
  end
end