diff --git a/API b/API
new file mode 100644
index 00000000..a83fa380
--- /dev/null
+++ b/API
@@ -0,0 +1,9 @@
+Overwrite method to read the current state
+
+ class MyClass
+ include AASM
+
+ def aasm_read_state
+ # retrieve the current state manually
+ end
+ end
diff --git a/lib/aasm/aasm.rb b/lib/aasm/aasm.rb
index 6a6caa6b..1f6c0131 100644
--- a/lib/aasm/aasm.rb
+++ b/lib/aasm/aasm.rb
@@ -81,6 +81,11 @@ def aasm
@aasm ||= AASM::InstanceBase.new(self)
end
+ # may be overwritten by persistence mixins
+ def aasm_read_state
+ aasm.enter_initial_state
+ end
+
# deprecated
def aasm_current_state
# warn "#aasm_current_state is deprecated and will be removed in version 3.2.0; please use #aasm.state instead!"
diff --git a/lib/aasm/instance_base.rb b/lib/aasm/instance_base.rb
index a16c947e..41f73394 100644
--- a/lib/aasm/instance_base.rb
+++ b/lib/aasm/instance_base.rb
@@ -6,7 +6,7 @@ def initialize(instance)
end
def current_state
- @current_state ||= persistable? ? @instance.aasm_read_state : enter_initial_state
+ @current_state ||= @instance.aasm_read_state
end
def current_state=(state)
@@ -77,11 +77,5 @@ def set_current_state_with_persistence(state)
save_success
end
- private
-
- def persistable?
- @instance.respond_to?(:aasm_read_state) || @instance.private_methods.include?('aasm_read_state')
- end
-
end
end
diff --git a/lib/aasm/persistence/active_record_persistence.rb b/lib/aasm/persistence/active_record_persistence.rb
index b2c70d93..f5b511b5 100644
--- a/lib/aasm/persistence/active_record_persistence.rb
+++ b/lib/aasm/persistence/active_record_persistence.rb
@@ -35,7 +35,7 @@ def self.included(base)
base.extend AASM::Persistence::Base::ClassMethods
base.extend AASM::Persistence::ActiveRecordPersistence::ClassMethods
base.send(:include, AASM::Persistence::ActiveRecordPersistence::InstanceMethods)
- base.send(:include, AASM::Persistence::ReadState) unless base.method_defined?(:aasm_read_state)
+ base.send(:include, AASM::Persistence::ReadState)
base.send(:include, AASM::Persistence::ActiveRecordPersistence::WriteState) unless base.method_defined?(:aasm_write_state)
base.send(:include, AASM::Persistence::ActiveRecordPersistence::WriteStateWithoutPersistence) unless base.method_defined?(:aasm_write_state_without_persistence)
diff --git a/lib/aasm/persistence/mongoid_persistence.rb b/lib/aasm/persistence/mongoid_persistence.rb
index e1eda1c8..787031e1 100644
--- a/lib/aasm/persistence/mongoid_persistence.rb
+++ b/lib/aasm/persistence/mongoid_persistence.rb
@@ -37,7 +37,7 @@ def self.included(base)
base.extend AASM::Persistence::Base::ClassMethods
base.extend AASM::Persistence::MongoidPersistence::ClassMethods
base.send(:include, AASM::Persistence::MongoidPersistence::InstanceMethods)
- base.send(:include, AASM::Persistence::ReadState) unless base.method_defined?(:aasm_read_state)
+ base.send(:include, AASM::Persistence::ReadState)
base.send(:include, AASM::Persistence::MongoidPersistence::WriteState) unless base.method_defined?(:aasm_write_state)
base.send(:include, AASM::Persistence::MongoidPersistence::WriteStateWithoutPersistence) unless base.method_defined?(:aasm_write_state_without_persistence)
diff --git a/lib/aasm/persistence/read_state.rb b/lib/aasm/persistence/read_state.rb
index 74bdf4a3..c6f19a67 100644
--- a/lib/aasm/persistence/read_state.rb
+++ b/lib/aasm/persistence/read_state.rb
@@ -2,16 +2,17 @@ module AASM
module Persistence
module ReadState
- # Returns the value of the aasm_column - called from aasm_current_state
+ # Returns the value of the aasm_column - called from aasm.current_state
#
# If it's a new record, and the aasm state column is blank it returns the initial state
# (example provided here for ActiveRecord, but it's true for Mongoid as well):
#
# class Foo < ActiveRecord::Base
# include AASM
- # aasm_column :status
- # aasm_state :opened
- # aasm_state :closed
+ # aasm :column => :status do
+ # state :opened
+ # state :closed
+ # end
# end
#
# foo = Foo.new
diff --git a/spec/models/active_record/api.rb b/spec/models/active_record/api.rb
new file mode 100644
index 00000000..7b4f39f6
--- /dev/null
+++ b/spec/models/active_record/api.rb
@@ -0,0 +1,43 @@
+class DefaultState
+ include AASM
+ aasm do
+ state :alpha, :initial => true
+ state :beta
+ state :gamma
+ end
+end
+
+class ProvidedState
+ include AASM
+ aasm do
+ state :alpha, :initial => true
+ state :beta
+ state :gamma
+ end
+
+ def aasm_read_state
+ :beta
+ end
+end
+
+class PersistedState < ActiveRecord::Base
+ include AASM
+ aasm do
+ state :alpha, :initial => true
+ state :beta
+ state :gamma
+ end
+end
+
+class ProvidedAndPersistedState < ActiveRecord::Base
+ include AASM
+ aasm do
+ state :alpha, :initial => true
+ state :beta
+ state :gamma
+ end
+
+ def aasm_read_state
+ :gamma
+ end
+end
diff --git a/spec/models/persistence.rb b/spec/models/persistence.rb
index e2e63de0..165c6e83 100644
--- a/spec/models/persistence.rb
+++ b/spec/models/persistence.rb
@@ -15,10 +15,11 @@ class Gate < ActiveRecord::Base
end
class Reader < ActiveRecord::Base
+ include AASM
+
def aasm_read_state
"fi"
end
- include AASM
end
class Writer < ActiveRecord::Base
diff --git a/spec/schema.rb b/spec/schema.rb
index e6105378..3f1f1102 100644
--- a/spec/schema.rb
+++ b/spec/schema.rb
@@ -1,6 +1,6 @@
ActiveRecord::Schema.define(:version => 0) do
- %w{gates readers writers transients simples simple_new_dsls thieves localizer_test_models}.each do |table_name|
+ %w{gates readers writers transients simples simple_new_dsls thieves localizer_test_models persisted_states provided_and_persisted_states}.each do |table_name|
create_table table_name, :force => true do |t|
t.string "aasm_state"
end
diff --git a/spec/unit/api_spec.rb b/spec/unit/api_spec.rb
new file mode 100644
index 00000000..77682033
--- /dev/null
+++ b/spec/unit/api_spec.rb
@@ -0,0 +1,20 @@
+require 'spec_helper'
+require 'models/active_record/api.rb'
+
+describe "retrieving the current state" do
+ it "uses the AASM default" do
+ DefaultState.new.aasm.current_state.should eql :alpha
+ end
+
+ it "uses the provided method" do
+ ProvidedState.new.aasm.current_state.should eql :beta
+ end
+
+ it "uses the persistence storage" do
+ PersistedState.new.aasm.current_state.should eql :alpha
+ end
+
+ it "uses the provided method even if persisted" do
+ ProvidedAndPersistedState.new.aasm.current_state.should eql :gamma
+ end
+end
diff --git a/spec/unit/persistence/active_record_persistence_spec.rb b/spec/unit/persistence/active_record_persistence_spec.rb
index 9311f8c1..0c2fd9de 100644
--- a/spec/unit/persistence/active_record_persistence_spec.rb
+++ b/spec/unit/persistence/active_record_persistence_spec.rb
@@ -24,16 +24,6 @@
end
end
-describe "class methods for classes with own read state" do
- let(:klass) {Reader}
- it_should_behave_like "aasm model"
- it "should include all persistence mixins but read state" do
- klass.included_modules.should_not be_include(AASM::Persistence::ReadState)
- klass.included_modules.should be_include(AASM::Persistence::ActiveRecordPersistence::WriteState)
- klass.included_modules.should be_include(AASM::Persistence::ActiveRecordPersistence::WriteStateWithoutPersistence)
- end
-end
-
describe "class methods for classes with own write state" do
let(:klass) {Writer}
it_should_behave_like "aasm model"