stateology 0.1.8 → 0.2.0
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.
- data/CHANGELOG +2 -1
- data/README.markdown +1 -2
- data/lib/stateology.rb +21 -6
- metadata +2 -2
data/CHANGELOG
CHANGED
data/README.markdown
CHANGED
|
@@ -117,12 +117,11 @@ In the above the string "hello" is passed as a parameter to the state\_entry() m
|
|
|
117
117
|
|
|
118
118
|
* The #state method can accept either a Symbol (e.g :Happy) or a Module (e.g Happy or Sample::Happy). The following are equivalent:
|
|
119
119
|
s.state :Happy #=> change state to Happy
|
|
120
|
+
s.state Sample::Happy #=> equivalent to above (note the fully qualified name; as Happy is a module defined under the Sample class)
|
|
120
121
|
|
|
121
122
|
* The #state method can take a block; the block will be executed after the successful change of state:
|
|
122
123
|
e.g s.state(:Happy) { s.hello } #=> hello method invoked immediately after change of state as it's in the block
|
|
123
124
|
|
|
124
|
-
s.state Sample::Happy #=> equivalent to above (note the fully qualified name; as Happy is a module defined under the Sample class)
|
|
125
|
-
|
|
126
125
|
* 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:
|
|
127
126
|
state Happy #=> Fully qualified module name not required when #state invoked in an instance method
|
|
128
127
|
|
data/lib/stateology.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# stateology.rb
|
|
2
2
|
# (C) John Mair 2008
|
|
3
3
|
# This program is distributed under the terms of the MIT License
|
|
4
|
+
# now supports BOTH ruby 1.8.6 and ruby 1.9.1
|
|
4
5
|
|
|
5
6
|
begin
|
|
6
7
|
require 'rubygems'
|
|
@@ -11,7 +12,7 @@ end
|
|
|
11
12
|
require 'mixology'
|
|
12
13
|
|
|
13
14
|
module Stateology
|
|
14
|
-
VERSION = "0.
|
|
15
|
+
VERSION = "0.2.0"
|
|
15
16
|
|
|
16
17
|
# alternative to 'nil'
|
|
17
18
|
Default = nil
|
|
@@ -21,18 +22,25 @@ module Stateology
|
|
|
21
22
|
c.extend(SM_Class_Methods)
|
|
22
23
|
end
|
|
23
24
|
|
|
25
|
+
|
|
24
26
|
# class methods
|
|
25
27
|
module SM_Class_Methods
|
|
26
28
|
def state(name, &block)
|
|
29
|
+
|
|
30
|
+
if RUBY_VERSION =~ /1.9/
|
|
31
|
+
pram = [false]
|
|
32
|
+
else
|
|
33
|
+
pram = []
|
|
34
|
+
end
|
|
27
35
|
|
|
28
36
|
# if const is defined here then module_eval
|
|
29
|
-
if
|
|
37
|
+
if const_defined?(name, *pram) then
|
|
30
38
|
self.module_eval(&block)
|
|
31
39
|
else
|
|
32
40
|
|
|
33
41
|
m = Module.new
|
|
34
42
|
# if the state is defined further up the chain then "inherit it"
|
|
35
|
-
if constants.include?(name
|
|
43
|
+
if constants.include?(name) || constants.include?(name.to_s) then
|
|
36
44
|
# if constant not defined here then must be inherited
|
|
37
45
|
inherited_state = const_get(name)
|
|
38
46
|
|
|
@@ -50,7 +58,7 @@ module Stateology
|
|
|
50
58
|
|
|
51
59
|
# strip the class path and return just the constant name, i.e Hello::Fren -> Fren
|
|
52
60
|
def __elided_class_path(sym)
|
|
53
|
-
|
|
61
|
+
sym.to_s.split(/::/).last.to_sym
|
|
54
62
|
end
|
|
55
63
|
|
|
56
64
|
def __sym_to_mod(sym)
|
|
@@ -58,8 +66,9 @@ module Stateology
|
|
|
58
66
|
end
|
|
59
67
|
|
|
60
68
|
def __mod_to_sym(mod)
|
|
69
|
+
|
|
61
70
|
# weird case where module does not have name (i.e when a state created on the eigenclass)
|
|
62
|
-
if mod.name == "" then
|
|
71
|
+
if mod.name == nil || mod.name == "" then
|
|
63
72
|
class << self; self; end.constants.each do |v|
|
|
64
73
|
return v.to_sym if __sym_to_mod(v.to_sym) == mod
|
|
65
74
|
end
|
|
@@ -72,13 +81,19 @@ module Stateology
|
|
|
72
81
|
# is state_name a nested state?
|
|
73
82
|
def __nested_state?(new_state)
|
|
74
83
|
|
|
84
|
+
if RUBY_VERSION =~ /1.9/
|
|
85
|
+
pram = [false]
|
|
86
|
+
else
|
|
87
|
+
pram = []
|
|
88
|
+
end
|
|
89
|
+
|
|
75
90
|
# test is:
|
|
76
91
|
# (1) are we currently in a state? (non nil)
|
|
77
92
|
# (2) is the new state a state? (non nil)
|
|
78
93
|
# (3) is the new state defined under the current state? (i.e it's nested)
|
|
79
94
|
__current_state &&
|
|
80
95
|
new_state &&
|
|
81
|
-
__current_state.const_defined?(__elided_class_path(__mod_to_sym(new_state)))
|
|
96
|
+
__current_state.const_defined?(__elided_class_path(__mod_to_sym(new_state)), *pram)
|
|
82
97
|
end
|
|
83
98
|
|
|
84
99
|
# instance methods
|
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.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- John Mair
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date:
|
|
12
|
+
date: 2009-06-13 00:00:00 +12:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|