soveran-micromachine 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +14 -8
- data/Rakefile +7 -2
- data/lib/micromachine.rb +20 -8
- metadata +1 -1
data/README.markdown
CHANGED
@@ -19,16 +19,22 @@ Usage
|
|
19
19
|
|
20
20
|
require 'micromachine'
|
21
21
|
|
22
|
-
|
22
|
+
machine = MicroMachine.new(:new) # Initial state.
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
machine.transitions_for[:confirm] = { :new => :confirmed }
|
25
|
+
machine.transitions_for[:ignore] = { :new => :ignored }
|
26
|
+
machine.transitions_for[:reset] = { :confirmed => :new, :ignored => :new }
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
machine.trigger(:confirm) #=> true
|
29
|
+
machine.trigger(:ignore) #=> false
|
30
|
+
machine.trigger(:reset) #=> true
|
31
|
+
machine.trigger(:ignore) #=> true
|
32
|
+
|
33
|
+
It can also have callbacks when entering some state:
|
34
|
+
|
35
|
+
machine.on(:confirmed) do
|
36
|
+
puts "Confirmed"
|
37
|
+
end
|
32
38
|
|
33
39
|
Installation
|
34
40
|
------------
|
data/Rakefile
CHANGED
@@ -7,14 +7,19 @@ gem_spec_file = 'micromachine.gemspec'
|
|
7
7
|
|
8
8
|
gem_spec = eval(File.read(gem_spec_file)) rescue nil
|
9
9
|
|
10
|
+
task :default => :test
|
11
|
+
|
12
|
+
Rake::TestTask.new(:test) do |t|
|
13
|
+
t.pattern = 'test/**/*_test.rb'
|
14
|
+
t.verbose = false
|
15
|
+
end
|
16
|
+
|
10
17
|
Rake::GemPackageTask.new(gem_spec) do |pkg|
|
11
18
|
pkg.need_zip = false
|
12
19
|
pkg.need_tar = false
|
13
20
|
rm_f FileList['pkg/**/*.*']
|
14
21
|
end if gem_spec
|
15
22
|
|
16
|
-
task :default => :gem
|
17
|
-
|
18
23
|
desc "Generate the gemspec file."
|
19
24
|
task :gemspec do
|
20
25
|
require 'erb'
|
data/lib/micromachine.rb
CHANGED
@@ -2,17 +2,22 @@
|
|
2
2
|
#
|
3
3
|
# Usage:
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# machine = MicroMachine.new(:new) # Initial state.
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
7
|
+
# machine.transitions_for[:confirm] = { :new => :confirmed }
|
8
|
+
# machine.transitions_for[:ignore] = { :new => :ignored }
|
9
|
+
# machine.transitions_for[:reset] = { :confirmed => :new, :ignored => :new }
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
11
|
+
# machine.trigger(:confirm) #=> true
|
12
|
+
# machine.trigger(:ignore) #=> false
|
13
|
+
# machine.trigger(:reset) #=> true
|
14
|
+
# machine.trigger(:ignore) #=> true
|
15
15
|
#
|
16
|
+
# It also handles callbacks that are executed when entering a different state.
|
17
|
+
#
|
18
|
+
# machine.on(:confirmed) do
|
19
|
+
# puts "Confirmed"
|
20
|
+
# end
|
16
21
|
class MicroMachine
|
17
22
|
attr :transitions_for
|
18
23
|
attr :state
|
@@ -20,11 +25,18 @@ class MicroMachine
|
|
20
25
|
def initialize initial_state
|
21
26
|
@state = initial_state
|
22
27
|
@transitions_for = Hash.new
|
28
|
+
@callbacks = Hash.new { |hash, key| hash[key] = [] }
|
29
|
+
end
|
30
|
+
|
31
|
+
def on key, &block
|
32
|
+
@callbacks[key] << block
|
23
33
|
end
|
24
34
|
|
25
35
|
def trigger event
|
26
36
|
if transitions_for[event][@state]
|
27
37
|
@state = transitions_for[event][@state]
|
38
|
+
@callbacks[@state].each { |callback| callback.call }
|
39
|
+
true
|
28
40
|
end
|
29
41
|
end
|
30
42
|
end
|