lib/transitions/state.rb in transitions-0.0.17 vs lib/transitions/state.rb in transitions-0.0.18

- old
+ new

@@ -25,11 +25,11 @@ attr_reader :name, :options def initialize(name, options = {}) @name = name if machine = options.delete(:machine) - machine.klass.define_state_query_method(name) + define_state_query_method(machine) end update(options) end def ==(state) @@ -60,8 +60,33 @@ def update(options = {}) @display_name = options.delete(:display) if options.key?(:display) @options = options self + end + + private + def define_state_query_method(machine) + method_name, state_name = "#{@name}?", @name # Instance vars are out of scope when calling define_method below, so we use local variables. + if method_already_defined_on_recipient?(machine, method_name) + override_warning method_name + else + machine.klass.send :define_method, method_name do + current_state.to_s == state_name.to_s + end + end + end + + def method_already_defined_on_recipient?(machine, method_name) + machine.klass.new.respond_to?(method_name) + end + + def override_warning(method_name) + warning = "Transitions: Can not define method #{method_name} because it is already defined, please rename either the existing method or the state." + if Rails && Rails.logger + Rails.logger.warn warning + else + puts warning + end end end end