Class: Statelogic::ActiveRecord::ClassMethods::ConfigHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/statelogic/activerecord.rb

Instance Method Summary collapse

Constructor Details

#initialize(cl, config) ⇒ ConfigHelper

Returns a new instance of ConfigHelper.



64
65
66
# File 'lib/statelogic/activerecord.rb', line 64

def initialize(cl, config)
  @class, @config = cl, config
end

Instance Method Details

#initial_state(name, options = {}, &block) ⇒ Object Also known as: initial



68
69
70
# File 'lib/statelogic/activerecord.rb', line 68

def initial_state(name, options = {}, &block)
  state(name, options.update(:initial => true), &block)
end

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



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/statelogic/activerecord.rb', line 74

def state(name, options = {}, &block)
  name = name.to_s
  uname = name.underscore
  attr = @config[:attribute]
  attr_was = :"#{attr}_was"
  find_all_by_attr = "find_all_by_#{attr}"

  Util.defmethod(@class, "#{uname}?") { send(attr) == name }
  Util.defmethod(@class, "was_#{uname}?") { send(attr_was) == name }

  [uname, "#{attr}_is_#{uname}".to_sym].each do |named_scope_name|
    unless @class.respond_to?(named_scope_name)
      @class.send(:named_scope, named_scope_name, :conditions => {attr.to_sym => name })
      Util.debug { "Statelogic has defined named scope #{named_scope_name} on #{@class.name}." }
    else
      Util.warn { "Statelogic won't override class method #{named_scope_name} already defined on #{@class.name}." }
    end
  end

  Util.defmethod(@class, "find_all_#{uname}", true) {|*args| send(find_all_by_attr, name, *args) }
  StateScopeHelper.new(@class, name, @config).instance_eval(&block) if block_given?

  @config[:states] << name
  @config[:initial] << name if options[:initial]
end