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