stateology 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README +40 -0
  2. data/lib/stateology.rb +5 -2
  3. data/sample.rb +45 -0
  4. metadata +1 -1
data/README CHANGED
@@ -4,6 +4,7 @@ Supports:
4
4
  * Dynamic switching between states (mixing and unmixing modules)
5
5
  * Clean DSL-style syntax
6
6
  * Optional state_entry() and state_exit() hooks for each state (automatically called upon state entry and exit)
7
+ * support for subclassing of classes that include Stateology (see below)
7
8
 
8
9
  Use as in the following:
9
10
 
@@ -77,6 +78,42 @@ s.do_something #=> "Kicks a puppy"
77
78
  s.state nil
78
79
  s.do_something #=> "stares at the ceiling"
79
80
 
81
+ UPDATE:
82
+ * made it so subclasses can inherit states from their superclasses e.g
83
+ class A
84
+ include Stateology
85
+
86
+ state(:Happy) {
87
+ def state_entry
88
+ puts "entering Happy state"
89
+ end
90
+
91
+ def hello
92
+ puts "hello from A"
93
+ end
94
+ }
95
+ end
96
+
97
+ class B < A
98
+ state(:Happy) {
99
+ def hello
100
+ puts "hello from B"
101
+ end
102
+ }
103
+ end
104
+
105
+ b = B.new
106
+
107
+ b.state :Happy
108
+ #=> "entering Happy state"
109
+
110
+ b.hello
111
+ #=> "hello from B"
112
+
113
+ * prior behaviour was for state_entry not to exist in class B as Happy module from class A was overwritten by the new Happy module in B
114
+ * how does this fix work? the Happy module in B just includes any extant Happy module accessible in B
115
+
116
+
80
117
 
81
118
 
82
119
  ---=A FEW THINGS TO NOTE=---
@@ -99,6 +136,9 @@ In the above the string "hello" is passed as a parameter to the state_entry() me
99
136
  * The #state method can accept either a Symbol (e.g :Happy) or a Module (e.g Happy or Sample::Happy). The following are equivalent:
100
137
  s.state :Happy #=> change state to Happy
101
138
 
139
+ * The #state method can take a block; the block will be executed after the successful change of state:
140
+ e.g s.state(:Happy) { s.hello } #=> hello method invoked immediately after change of state as it's in the block
141
+
102
142
  s.state Sample::Happy #=> equivalent to above (note the fully qualified name; as Happy is a module defined under the Sample class)
103
143
 
104
144
  * alternatively; if the #state method is invoked internally by another instance method of the Sample class then a fully qualified module name is not required:
data/lib/stateology.rb CHANGED
@@ -65,7 +65,7 @@ module Stateology
65
65
 
66
66
  end
67
67
 
68
- def state(*state_args)
68
+ def state(*state_args, &block)
69
69
 
70
70
  # behave as getter
71
71
  if(state_args.empty?) then
@@ -89,10 +89,13 @@ module Stateology
89
89
 
90
90
  # enter new state
91
91
  __state_prologue(state_name, state_args)
92
-
92
+
93
93
  # update the current state variable
94
94
  @__SM_cur_state = state_name
95
95
 
96
+ # if we were given a block, run it now
97
+ if(block) then yield end
98
+
96
99
  rescue NameError
97
100
  raise NameError, "#{state_name} not a valid state"
98
101
 
data/sample.rb CHANGED
@@ -53,7 +53,18 @@ class Sample
53
53
 
54
54
  end
55
55
 
56
+ class SampleChild < Sample
57
+ state(:Happy) {
58
+ def do_something
59
+ puts "pets a Kitten"
60
+ end
61
+ }
62
+ end
63
+
56
64
  s = Sample.new
65
+ sc = SampleChild.new
66
+
67
+ puts "Testing Sample"
57
68
 
58
69
  # in Default state
59
70
  s.do_something #=> "stares at the ceiling"
@@ -75,6 +86,40 @@ s.state :Angry
75
86
  # what state are we in?
76
87
  puts s.state
77
88
 
89
+ # pass a block to state transition
90
+ puts "passing a block"
91
+ s.state :Happy do
92
+ s.do_something; s.do_something; s.do_something
93
+ end
94
+
95
+
96
+ puts "**********************"
97
+ puts "Now Testing SampleChild"
98
+ # in Default state
99
+ sc.do_something #=> "stares at the ceiling"
100
+
101
+ # now switch to Happy state
102
+ sc.state :Happy
103
+ sc.do_something #=> "Pets a puppy"
104
+
105
+ # now switch to Angry state
106
+ sc.state Sample::Angry
107
+ sc.do_something #=> "Kicks a puppy"
108
+
109
+ # now switch back to Default state
110
+ sc.state nil
111
+ sc.do_something #=> "stares at the ceiling"
112
+
113
+ sc.state :Angry
114
+
115
+ # what state are we in?
116
+ puts sc.state
117
+
118
+ # pass a block to state transition
119
+ puts "passing a block"
120
+ sc.state :Happy do
121
+ sc.do_something; sc.do_something; sc.do_something
122
+ end
78
123
 
79
124
 
80
125
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stateology
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mair