statemachine 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. data/.gitignore +12 -0
  2. data/Gemfile +6 -0
  3. data/Gemfile.lock +12 -0
  4. data/Rakefile +21 -20
  5. data/doc/website/README +6 -0
  6. data/doc/website/config.yaml +2 -0
  7. data/doc/website/index.html +39 -0
  8. data/doc/website/src/default.css +110 -0
  9. data/doc/website/src/default.template +41 -0
  10. data/doc/website/src/documentation.page +45 -0
  11. data/doc/website/src/example.page +13 -0
  12. data/doc/website/src/example1.page +59 -0
  13. data/doc/website/src/example2.page +96 -0
  14. data/doc/website/src/example3.page +76 -0
  15. data/doc/website/src/example4.page +65 -0
  16. data/doc/website/src/images/8l_star.png +0 -0
  17. data/doc/website/src/images/bg.png +0 -0
  18. data/doc/website/src/images/bottom_border.png +0 -0
  19. data/doc/website/src/images/bottom_edge.png +0 -0
  20. data/doc/website/src/images/examples/vending_machine.png +0 -0
  21. data/doc/website/src/images/examples/vending_machine2.png +0 -0
  22. data/doc/website/src/images/examples/vending_machine3.png +0 -0
  23. data/doc/website/src/images/examples/vending_machine4a.png +0 -0
  24. data/doc/website/src/images/examples/vending_machine4b.png +0 -0
  25. data/doc/website/src/images/left_edge.png +0 -0
  26. data/doc/website/src/images/logo.png +0 -0
  27. data/doc/website/src/images/right_edge.png +0 -0
  28. data/doc/website/src/images/side_borders.png +0 -0
  29. data/doc/website/src/index.page +20 -0
  30. data/generate_tests/dot_graph/turnstile.rb +29 -0
  31. data/generate_tests/dot_graph/turnstile2.rb +48 -0
  32. data/generate_tests/java/turnstile.rb +54 -0
  33. data/generate_tests/java/turnstile2.rb +72 -0
  34. data/lib/statemachine/action_invokation.rb +0 -19
  35. data/lib/statemachine/version.rb +2 -2
  36. data/rails_plugin/README +183 -0
  37. data/rails_plugin/Rakefile +11 -0
  38. data/rails_plugin/app/controllers/admin_controller.rb +43 -0
  39. data/rails_plugin/app/controllers/application.rb +7 -0
  40. data/rails_plugin/app/controllers/main_controller.rb +34 -0
  41. data/rails_plugin/app/helpers/admin_helper.rb +2 -0
  42. data/rails_plugin/app/helpers/application_helper.rb +3 -0
  43. data/rails_plugin/app/helpers/main_helper.rb +7 -0
  44. data/rails_plugin/app/models/product.rb +21 -0
  45. data/rails_plugin/app/models/vending_machine.rb +36 -0
  46. data/rails_plugin/app/models/vending_machine_interface.rb +101 -0
  47. data/rails_plugin/app/models/vending_statemachine.rb +41 -0
  48. data/rails_plugin/app/views/admin/index.rhtml +45 -0
  49. data/rails_plugin/app/views/layouts/main.rhtml +12 -0
  50. data/rails_plugin/app/views/main/_info.rhtml +13 -0
  51. data/rails_plugin/app/views/main/event.rjs +27 -0
  52. data/rails_plugin/app/views/main/index.rhtml +38 -0
  53. data/rails_plugin/config/boot.rb +45 -0
  54. data/rails_plugin/config/database.yml +21 -0
  55. data/rails_plugin/config/environment.rb +60 -0
  56. data/rails_plugin/config/environments/development.rb +21 -0
  57. data/rails_plugin/config/environments/production.rb +18 -0
  58. data/rails_plugin/config/environments/test.rb +19 -0
  59. data/rails_plugin/config/routes.rb +23 -0
  60. data/rails_plugin/db/migrate/001_create_vending_machines.rb +12 -0
  61. data/rails_plugin/db/migrate/002_create_products.rb +14 -0
  62. data/rails_plugin/db/migrate/003_add_position_to_products.rb +9 -0
  63. data/rails_plugin/db/schema.rb +20 -0
  64. data/rails_plugin/doc/README_FOR_APP +2 -0
  65. data/rails_plugin/lib/tasks/base.rake +5 -0
  66. data/rails_plugin/public/.htaccess +40 -0
  67. data/rails_plugin/public/404.html +30 -0
  68. data/rails_plugin/public/500.html +30 -0
  69. data/rails_plugin/public/dispatch.cgi +10 -0
  70. data/rails_plugin/public/dispatch.fcgi +24 -0
  71. data/rails_plugin/public/dispatch.rb +10 -0
  72. data/rails_plugin/public/favicon.ico +0 -0
  73. data/rails_plugin/public/images/bricks.jpg +0 -0
  74. data/rails_plugin/public/images/cash_release_button.png +0 -0
  75. data/rails_plugin/public/images/change.png +0 -0
  76. data/rails_plugin/public/images/dime.png +0 -0
  77. data/rails_plugin/public/images/dollar.png +0 -0
  78. data/rails_plugin/public/images/money_panel.png +0 -0
  79. data/rails_plugin/public/images/nickel.png +0 -0
  80. data/rails_plugin/public/images/quarter.png +0 -0
  81. data/rails_plugin/public/images/rails.png +0 -0
  82. data/rails_plugin/public/images/vending_machine_body.png +0 -0
  83. data/rails_plugin/public/index.html +277 -0
  84. data/rails_plugin/public/javascripts/application.js +2 -0
  85. data/rails_plugin/public/javascripts/controls.js +833 -0
  86. data/rails_plugin/public/javascripts/dragdrop.js +942 -0
  87. data/rails_plugin/public/javascripts/effects.js +1088 -0
  88. data/rails_plugin/public/javascripts/prototype.js +2515 -0
  89. data/rails_plugin/public/robots.txt +1 -0
  90. data/rails_plugin/public/stylesheets/layout.css +163 -0
  91. data/rails_plugin/script/about +3 -0
  92. data/rails_plugin/script/breakpointer +3 -0
  93. data/rails_plugin/script/console +3 -0
  94. data/rails_plugin/script/destroy +3 -0
  95. data/rails_plugin/script/generate +3 -0
  96. data/rails_plugin/script/performance/benchmarker +3 -0
  97. data/rails_plugin/script/performance/profiler +3 -0
  98. data/rails_plugin/script/plugin +3 -0
  99. data/rails_plugin/script/process/inspector +3 -0
  100. data/rails_plugin/script/process/reaper +3 -0
  101. data/rails_plugin/script/process/spawner +3 -0
  102. data/rails_plugin/script/rails_spec +11 -0
  103. data/rails_plugin/script/rails_spec_server +43 -0
  104. data/rails_plugin/script/runner +3 -0
  105. data/rails_plugin/script/server +3 -0
  106. data/rails_plugin/spec/controllers/admin_controller_spec.rb +7 -0
  107. data/rails_plugin/spec/controllers/main_controller_spec.rb +38 -0
  108. data/rails_plugin/spec/fixtures/products.yml +2 -0
  109. data/rails_plugin/spec/fixtures/vending_machines.yml +2 -0
  110. data/rails_plugin/spec/helpers/admin_helper_spec.rb +5 -0
  111. data/rails_plugin/spec/helpers/main_helper_spec.rb +5 -0
  112. data/rails_plugin/spec/models/product_spec.rb +16 -0
  113. data/rails_plugin/spec/models/vending_machine_interface_spec.rb +168 -0
  114. data/rails_plugin/spec/models/vending_machine_spec.rb +30 -0
  115. data/rails_plugin/spec/models/vending_statemachine_spec.rb +130 -0
  116. data/rails_plugin/spec/plugins/context_support_spec.rb +28 -0
  117. data/rails_plugin/spec/plugins/controller_support_spec.rb +98 -0
  118. data/rails_plugin/spec/spec.opts +1 -0
  119. data/rails_plugin/spec/spec_helper.rb +28 -0
  120. data/rails_plugin/spec/views/main/event_spec.rb +61 -0
  121. data/rails_plugin/vendor/plugins/statemachine/README +4 -0
  122. data/rails_plugin/vendor/plugins/statemachine/Rakefile +22 -0
  123. data/rails_plugin/vendor/plugins/statemachine/init.rb +2 -0
  124. data/rails_plugin/vendor/plugins/statemachine/install.rb +1 -0
  125. data/rails_plugin/vendor/plugins/statemachine/lib/context_support.rb +22 -0
  126. data/rails_plugin/vendor/plugins/statemachine/lib/controller_support.rb +85 -0
  127. data/rails_plugin/vendor/plugins/statemachine/lib/statemachine_on_rails.rb +11 -0
  128. data/rails_plugin/vendor/plugins/statemachine/tasks/statemachine_tasks.rake +4 -0
  129. data/spec/action_invokation_spec.rb +1 -1
  130. data/spec/builder_spec.rb +1 -1
  131. data/spec/default_transition_spec.rb +1 -1
  132. data/spec/generate/dot_graph/dot_graph_stagemachine_spec.rb +1 -1
  133. data/spec/history_spec.rb +1 -1
  134. data/spec/sm_action_parameterization_spec.rb +1 -1
  135. data/spec/sm_entry_exit_actions_spec.rb +1 -1
  136. data/spec/sm_odds_n_ends_spec.rb +1 -1
  137. data/spec/sm_simple_spec.rb +1 -1
  138. data/spec/sm_super_state_spec.rb +1 -1
  139. data/spec/sm_turnstile_spec.rb +1 -1
  140. data/spec/transition_spec.rb +1 -1
  141. metadata +162 -46
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "VendingMachine class with fixtures loaded" do
4
+ fixtures :vending_machines, :products
5
+
6
+ before(:each) do
7
+ @vm = VendingMachine.new(:location => "Cafeteria", :cash => 1000)
8
+ @vm.save!
9
+ end
10
+
11
+ it "Create with location and cash" do
12
+ loaded = VendingMachine.find(@vm.id)
13
+ loaded.location.should eql("Cafeteria")
14
+ loaded.cash.should equal 1000
15
+ end
16
+
17
+ it "Add rack" do
18
+ @vm.add_product(20, "Water", 150)
19
+ @vm.save!
20
+
21
+ loaded = VendingMachine.find(@vm.id)
22
+ loaded.products.length.should equal 1
23
+ loaded.products[0].name.should eql("Water")
24
+ loaded.products[0].price.should eql(150)
25
+ loaded.products[0].inventory.should equal 20
26
+ end
27
+
28
+
29
+
30
+ end
@@ -0,0 +1,130 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Vending Statemachine" do
4
+
5
+ before(:each) do
6
+ @sm = VendingStatemachine.statemachine
7
+ @context = mock("context")
8
+ @sm.context = @context
9
+ end
10
+
11
+ it "start state" do
12
+ @sm.state.should equal :standby
13
+ end
14
+
15
+ it "dollar" do
16
+ check_money_event(:dollar, :add_dollar)
17
+ end
18
+
19
+ it "quarter" do
20
+ check_money_event(:quarter, :add_quarter)
21
+ end
22
+
23
+ it "dime" do
24
+ check_money_event(:dime, :add_dime)
25
+ end
26
+
27
+ it "nickel" do
28
+ check_money_event(:nickel, :add_nickel)
29
+ end
30
+
31
+ def check_money_event(event, method)
32
+ @context.should_receive(:clear_dispensers)
33
+ @context.should_receive(method)
34
+ @context.should_receive(:check_max_price)
35
+
36
+ @sm.process_event(event)
37
+ @sm.state.should equal :collecting_money
38
+ end
39
+
40
+ it "standby selection" do
41
+ @context.should_receive(:clear_dispensers)
42
+
43
+ @sm.selection
44
+ @sm.state.should equal :standby
45
+ end
46
+
47
+ it "standby collecting_money" do
48
+ @sm.state = :collecting_money
49
+ @context.should_receive(:load_product).with(123)
50
+ @context.should_receive(:check_affordability)
51
+
52
+ @sm.selection(123)
53
+ @sm.state.should equal :validating_purchase
54
+ end
55
+
56
+ it "reached max_price" do
57
+ @sm.state = :collecting_money
58
+ @context.should_receive(:refuse_money)
59
+
60
+ @sm.reached_max_price
61
+ @sm.state.should equal :max_price_tendered
62
+ end
63
+
64
+ it "accept purchase" do
65
+ @sm.state = :validating_purchase
66
+ @context.should_receive(:make_sale)
67
+
68
+ @sm.accept_purchase
69
+ @sm.state.should equal :standby
70
+ end
71
+
72
+ it "refuse purchase" do
73
+ @sm.state = :validating_purchase
74
+ @context.should_receive(:check_max_price)
75
+
76
+ @sm.refuse_purchase
77
+ @sm.state.should equal :collecting_money
78
+ end
79
+
80
+ it "money in max_price_tendered" do
81
+ @sm.state = :max_price_tendered
82
+
83
+ @sm.dollar
84
+ @sm.state.should equal :max_price_tendered
85
+ @sm.quarter
86
+ @sm.state.should equal :max_price_tendered
87
+ @sm.dime
88
+ @sm.state.should equal :max_price_tendered
89
+ @sm.nickel
90
+ @sm.state.should equal :max_price_tendered
91
+ end
92
+
93
+ it "selection in max_price_tendered" do
94
+ @sm.state = :max_price_tendered
95
+ @context.should_receive(:load_and_make_sale).with(123)
96
+ @context.should_receive(:accept_money)
97
+
98
+ @sm.selection(123)
99
+ @sm.state.should equal :standby
100
+ end
101
+
102
+ it "release money from standby" do
103
+ @context.should_receive(:clear_dispensers)
104
+ @sm.release_money
105
+
106
+ @sm.state.should equal :standby
107
+ end
108
+
109
+ it "release money from collecting money" do
110
+ @sm.state = :collecting_money
111
+ @context.should_receive(:dispense_change)
112
+
113
+ @sm.release_money
114
+
115
+ @sm.state.should equal :standby
116
+ end
117
+
118
+ it "release money from max_price_tendered" do
119
+ @sm.state = :max_price_tendered
120
+ @context.should_receive(:dispense_change)
121
+ @context.should_receive(:accept_money)
122
+
123
+ @sm.release_money
124
+
125
+ @sm.state.should equal :standby
126
+ end
127
+
128
+
129
+
130
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "Context Support" do
4
+
5
+ before(:each) do
6
+ @product = Product.new(:name => "Chicken")
7
+ @product.save!
8
+ end
9
+
10
+ it "Active Recrods Marshalled Compact" do
11
+ io = StringIO.new("")
12
+ Marshal.dump(@product, io)
13
+ io.rewind
14
+
15
+ dump = io.read
16
+ dump.should_not include("Chicken")
17
+ end
18
+
19
+ it "Active Records Loaded properly" do
20
+ io = StringIO.new("")
21
+ Marshal.dump(@product, io)
22
+ io.rewind
23
+
24
+ loaded = Marshal.load(io)
25
+ loaded.name.should eql("Chicken")
26
+ end
27
+
28
+ end
@@ -0,0 +1,98 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class SampleContext
4
+ include Statemachine::ContextSupport
5
+ end
6
+
7
+ class SampleStatemachine
8
+ attr_accessor :context
9
+ end
10
+
11
+ class SampleController
12
+
13
+ include Statemachine::ControllerSupport
14
+ supported_by_statemachine SampleContext, lambda { SampleStatemachine.new }
15
+
16
+ attr_accessor :session, :initialized, :before, :after, :params, :can_continue
17
+
18
+ def initialize(statemachine, context)
19
+ @statemachine = statemachine
20
+ @context = context
21
+ @session = {}
22
+ @can_continue = true
23
+ end
24
+
25
+ def initialize_context(*args)
26
+ @initialized = true
27
+ end
28
+
29
+ def before_event
30
+ @before = true
31
+ return @can_continue
32
+ end
33
+
34
+ def after_event
35
+ @after = true
36
+ end
37
+
38
+ end
39
+
40
+ describe "State Machine Support" do
41
+
42
+ before(:each) do
43
+ @statemachine = mock("statemachine")
44
+ @context = mock("context")
45
+ @controller = SampleController.new(@statemachine, @context)
46
+ end
47
+
48
+ it "save state" do
49
+ @controller.send(:save_state)
50
+
51
+ @controller.session[:samplecontroller_state].should equal @context
52
+ end
53
+
54
+ it "recall state" do
55
+ @controller.session[:samplecontroller_state] = @context
56
+ @context.should_receive(:statemachine)
57
+
58
+ @controller.send(:recall_state)
59
+ end
60
+
61
+ it "new context" do
62
+ @controller = SampleController.new(nil, nil)
63
+ @controller.send(:new_context)
64
+
65
+ @controller.context.should_not equal nil
66
+ @controller.statemachine.should_not equal nil
67
+ @controller.context.statemachine.should equal @controller.statemachine
68
+ @controller.statemachine.context.should equal @controller.context
69
+ @controller.initialized.should equal true
70
+ end
71
+
72
+ it "event action" do
73
+ @controller.params = {:event => "boo"}
74
+ @controller.session[:samplecontroller_state] = @context
75
+ @context.should_receive(:statemachine).and_return(@statemachine)
76
+ @statemachine.should_receive(:process_event).with("boo", nil)
77
+
78
+ @controller.event
79
+
80
+ @controller.before.should equal true
81
+ @controller.after.should equal true
82
+ end
83
+
84
+ it "the event is not invoked is before_event return false" do
85
+ @controller.params = {:event => "boo"}
86
+ @controller.session[:samplecontroller_state] = @context
87
+ @context.should_not_receive(:statemachine)
88
+ @statemachine.should_not_receive(:process_event)
89
+ @controller.can_continue = false
90
+
91
+ @controller.event
92
+
93
+ @controller.before.should equal true
94
+ @controller.after.should_not equal true
95
+ end
96
+
97
+
98
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,28 @@
1
+ # This file is copied to ~/spec when you run 'ruby script/generate rspec'
2
+ # from the project root directory.
3
+ ENV["RAILS_ENV"] ||= "test"
4
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
5
+ require 'spec/rails'
6
+
7
+ require 'statemachine_on_rails'
8
+
9
+ # Even if you're using RSpec, RSpec on Rails is reusing some of the
10
+ # Rails-specific extensions for fixtures and stubbed requests, response
11
+ # and other things (via RSpec's inherit mechanism). These extensions are
12
+ # tightly coupled to Test::Unit in Rails, which is why you're seeing it here.
13
+ module Spec
14
+ module Rails
15
+ module Runner
16
+ class EvalContext < Test::Unit::TestCase
17
+ self.use_transactional_fixtures = true
18
+ self.use_instantiated_fixtures = false
19
+ self.fixture_path = RAILS_ROOT + '/spec/fixtures'
20
+
21
+ # You can set up your global fixtures here, or you
22
+ # can do it in individual contexts using "fixtures :table_a, table_b".
23
+ #
24
+ #self.global_fixtures = :table_a, :table_b
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ class Stub
4
+ attr_reader :id
5
+
6
+ def initialize(id)
7
+ @id = id
8
+ end
9
+ end
10
+
11
+ describe "Event View" do
12
+
13
+ before(:each) do
14
+ @display = mock("display")
15
+ @display.stub!(:message).and_return("$123.45")
16
+ @display.stub!(:affordable_items).and_return([Stub.new(1)])
17
+ @display.stub!(:non_affordable_items).and_return([Stub.new(2)])
18
+ @display.stub!(:sold_out_items).and_return([Stub.new(3)])
19
+ @display.stub!(:dispensed_item).and_return(Product.new(:name => "Milk"))
20
+ @display.stub!(:change).and_return("$0.25")
21
+
22
+ @vending_machine = mock("vending machine")
23
+ @vending_machine.stub!(:location).and_return("Downstairs")
24
+ @vending_machine.stub!(:cash_str).and_return("$10.00")
25
+ @vending_machine.stub!(:products).and_return([])
26
+
27
+ assigns[:context] = @display
28
+ assigns[:vending_machine] = @vending_machine
29
+
30
+ render "/main/event"
31
+ end
32
+
33
+ it "message" do
34
+ response.should have_rjs(:replace_html, "quartz_screen", ")$123.45"
35
+ end
36
+
37
+ it "affordable items" do
38
+ response.body.should include("document.getElementById('product_1').className)= 'affordable'"
39
+ end
40
+
41
+ it "non affordable items" do
42
+ response.body.should include("document.getElementById('product_2').className)= 'non_affordable'"
43
+ end
44
+
45
+ it "sold_out" do
46
+ response.should have_rjs(:replace_html, "product_3_price", ")<span style=\"color: red;\">SOLD OUT</span>"
47
+ end
48
+
49
+ it "dispenser" do
50
+ response.should have_rjs(:replace_html, "dispenser", ")<p>Milk</p>"
51
+ response.should have_rjs(:show, "dispenser")
52
+ end
53
+
54
+ it "change" do
55
+ response.should have_rjs(:replace_html, "change_amount", ")<p>$0.25</p>"
56
+ response.should have_rjs(:show, "change_amount")
57
+ end
58
+
59
+
60
+
61
+ end
@@ -0,0 +1,4 @@
1
+ StatemachineController
2
+ ======================
3
+
4
+ Description goes here
@@ -0,0 +1,22 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the statemachine_controller plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation for the statemachine_controller plugin.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'StatemachineController'
19
+ rdoc.options << '--line-numbers' << '--inline-source'
20
+ rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
@@ -0,0 +1,2 @@
1
+ require 'statemachine_on_rails'
2
+
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,22 @@
1
+ module Statemachine
2
+
3
+ module ContextSupport
4
+
5
+ attr_accessor :statemachine, :context
6
+
7
+ end
8
+
9
+ module ActiveRecordMarshalling
10
+ def marshal_dump
11
+ return self.id
12
+ end
13
+
14
+ def marshal_load(id)
15
+ @attributes = {}
16
+ @new_record = false
17
+ self.id = id
18
+ self.reload
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,85 @@
1
+ require 'statemachine'
2
+
3
+ module Statemachine
4
+ module ControllerSupport
5
+
6
+ def self.included(base)
7
+ base.extend SupportMacro
8
+ end
9
+
10
+ module SupportMacro
11
+
12
+ def supported_by_statemachine(a_context_class, a_statemachine_creation)
13
+ self.extend ClassMethods
14
+ self.send(:include, InstanceMethods)
15
+
16
+ self.context_class = a_context_class
17
+ self.statemachine_creation = a_statemachine_creation
18
+ end
19
+
20
+ end
21
+
22
+ module ClassMethods
23
+
24
+ attr_accessor :context_class, :statemachine_creation
25
+
26
+ end
27
+
28
+ module InstanceMethods
29
+
30
+ attr_reader :statemachine, :context
31
+
32
+ def event
33
+ can_continue = before_event
34
+ if can_continue
35
+ recall_state
36
+ puts "@context_event1: #{@context}"
37
+ event = params[:event]
38
+ arg = params[:arg]
39
+ @statemachine.process_event(event, arg)
40
+ after_event
41
+ save_state
42
+ puts "@context_event2: #{@context}"
43
+ end
44
+ end
45
+
46
+ protected
47
+
48
+ def before_event
49
+ return true
50
+ end
51
+
52
+ def after_event
53
+ end
54
+
55
+ def new_context(*args)
56
+ @context = self.class.context_class.new
57
+ puts "@context_new_context: #{@context}"
58
+ @statemachine = self.class.statemachine_creation.call(*args)
59
+ @statemachine.context = @context
60
+ @context.statemachine = @statemachine
61
+ initialize_context(*args)
62
+ save_state
63
+ end
64
+
65
+ def save_state
66
+ session[state_session_key] = @context
67
+ end
68
+
69
+ def initialize_context(*args)
70
+ end
71
+
72
+ def prepare_for_render
73
+ end
74
+
75
+ def recall_state
76
+ @context = session[state_session_key]
77
+ @statemachine = @context.statemachine
78
+ end
79
+
80
+ def state_session_key
81
+ return "#{self.class.name.downcase}_state".to_sym
82
+ end
83
+ end
84
+ end
85
+ end