ardm-is-state_machine 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +35 -0
- data/.travis.yml +11 -0
- data/Gemfile +65 -0
- data/LICENSE +20 -0
- data/README.rdoc +102 -0
- data/Rakefile +4 -0
- data/ardm-is-state_machine.gemspec +24 -0
- data/lib/ardm-is-state_machine.rb +1 -0
- data/lib/dm-is-state_machine.rb +10 -0
- data/lib/dm-is-state_machine/is/data/event.rb +25 -0
- data/lib/dm-is-state_machine/is/data/machine.rb +90 -0
- data/lib/dm-is-state_machine/is/data/state.rb +21 -0
- data/lib/dm-is-state_machine/is/dsl/event_dsl.rb +81 -0
- data/lib/dm-is-state_machine/is/dsl/state_dsl.rb +40 -0
- data/lib/dm-is-state_machine/is/state_machine.rb +139 -0
- data/lib/dm-is-state_machine/is/version.rb +7 -0
- data/spec/examples/invalid_events.rb +20 -0
- data/spec/examples/invalid_states.rb +20 -0
- data/spec/examples/invalid_transitions_1.rb +22 -0
- data/spec/examples/invalid_transitions_2.rb +22 -0
- data/spec/examples/light_switch.rb +25 -0
- data/spec/examples/slot_machine.rb +48 -0
- data/spec/examples/traffic_light.rb +48 -0
- data/spec/integration/inheritance_spec.rb +11 -0
- data/spec/integration/invalid_events_spec.rb +11 -0
- data/spec/integration/invalid_states_spec.rb +11 -0
- data/spec/integration/invalid_transitions_spec.rb +21 -0
- data/spec/integration/slot_machine_spec.rb +86 -0
- data/spec/integration/traffic_light_spec.rb +181 -0
- data/spec/rcov.opts +6 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/unit/data/event_spec.rb +27 -0
- data/spec/unit/data/machine_spec.rb +102 -0
- data/spec/unit/data/state_spec.rb +21 -0
- data/spec/unit/dsl/event_dsl_spec.rb +55 -0
- data/spec/unit/dsl/state_dsl_spec.rb +24 -0
- data/spec/unit/state_machine_spec.rb +28 -0
- data/tasks/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 33f98553240c3dda7d71d6c6778ced2eef9aea70
|
4
|
+
data.tar.gz: 47c1378362e0d2c2e4cc6250b9fb20903627a493
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 348a08cd707301ae0978cad8f57eb347de5d44b14943ebf09ccb10feffbee0388d831487499c8e73128f0b959afcce18b9b8535d25c04f6eda752e7c5eb84621
|
7
|
+
data.tar.gz: a7fd6133e0d63ae775cae9e574ef465578769a05ba0be7453933614133f3a14d80f15677daf61cadbf34a65e20808eee2b5e9abc4be6c14d2c4340d1b635a0a6
|
data/.gitignore
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
## MAC OS
|
2
|
+
.DS_Store
|
3
|
+
|
4
|
+
## TEXTMATE
|
5
|
+
*.tmproj
|
6
|
+
tmtags
|
7
|
+
|
8
|
+
## EMACS
|
9
|
+
*~
|
10
|
+
\#*
|
11
|
+
.\#*
|
12
|
+
|
13
|
+
## VIM
|
14
|
+
*.swp
|
15
|
+
|
16
|
+
## Rubinius
|
17
|
+
*.rbc
|
18
|
+
|
19
|
+
## PROJECT::GENERAL
|
20
|
+
*.gem
|
21
|
+
coverage
|
22
|
+
rdoc
|
23
|
+
pkg
|
24
|
+
tmp
|
25
|
+
doc
|
26
|
+
log
|
27
|
+
.yardoc
|
28
|
+
measurements
|
29
|
+
|
30
|
+
## BUNDLER
|
31
|
+
.bundle
|
32
|
+
Gemfile.*
|
33
|
+
|
34
|
+
## PROJECT::SPECIFIC
|
35
|
+
spec/db/
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
gemspec
|
6
|
+
|
7
|
+
SOURCE = ENV.fetch('SOURCE', :git).to_sym
|
8
|
+
REPO_POSTFIX = SOURCE == :path ? '' : '.git'
|
9
|
+
DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/ar-dm'
|
10
|
+
DM_VERSION = '~> 1.2.0'
|
11
|
+
DO_VERSION = '~> 0.10.6'
|
12
|
+
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
13
|
+
CURRENT_BRANCH = ENV.fetch('GIT_BRANCH', 'master')
|
14
|
+
|
15
|
+
gem 'ardm-core', DM_VERSION,
|
16
|
+
SOURCE => "#{DATAMAPPER}/ardm-core#{REPO_POSTFIX}",
|
17
|
+
:branch => CURRENT_BRANCH
|
18
|
+
|
19
|
+
platforms :mri_18 do
|
20
|
+
group :quality do
|
21
|
+
|
22
|
+
gem 'rcov', '~> 0.9.10'
|
23
|
+
gem 'yard', '~> 0.7.2'
|
24
|
+
gem 'yardstick', '~> 0.4'
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
group :datamapper do
|
30
|
+
|
31
|
+
adapters = ENV['ADAPTER'] || ENV['ADAPTERS']
|
32
|
+
adapters = adapters.to_s.tr(',', ' ').split.uniq - %w[ in_memory ]
|
33
|
+
|
34
|
+
if (do_adapters = DM_DO_ADAPTERS & adapters).any?
|
35
|
+
do_options = {}
|
36
|
+
do_options[:git] = "#{DATAMAPPER}/do#{REPO_POSTFIX}" if ENV['DO_GIT'] == 'true'
|
37
|
+
|
38
|
+
gem 'data_objects', DO_VERSION, do_options.dup
|
39
|
+
|
40
|
+
do_adapters.each do |adapter|
|
41
|
+
adapter = 'sqlite3' if adapter == 'sqlite'
|
42
|
+
gem "do_#{adapter}", DO_VERSION, do_options.dup
|
43
|
+
end
|
44
|
+
|
45
|
+
gem 'ardm-do-adapter', DM_VERSION,
|
46
|
+
SOURCE => "#{DATAMAPPER}/ardm-do-adapter#{REPO_POSTFIX}",
|
47
|
+
:branch => CURRENT_BRANCH
|
48
|
+
end
|
49
|
+
|
50
|
+
adapters.each do |adapter|
|
51
|
+
gem "ardm-#{adapter}-adapter", DM_VERSION,
|
52
|
+
SOURCE => "#{DATAMAPPER}/ardm-#{adapter}-adapter#{REPO_POSTFIX}",
|
53
|
+
:branch => CURRENT_BRANCH
|
54
|
+
end
|
55
|
+
|
56
|
+
plugins = ENV['PLUGINS'] || ENV['PLUGIN']
|
57
|
+
plugins = plugins.to_s.tr(',', ' ').split.push('ardm-migrations').uniq
|
58
|
+
|
59
|
+
plugins.each do |plugin|
|
60
|
+
gem plugin, DM_VERSION,
|
61
|
+
SOURCE => "#{DATAMAPPER}/#{plugin}#{REPO_POSTFIX}",
|
62
|
+
:branch => CURRENT_BRANCH
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 David James
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
= dm-is-state_machine
|
2
|
+
|
3
|
+
DataMapper plugin that adds state machine functionality to your models.
|
4
|
+
|
5
|
+
== Why is this plugin useful?
|
6
|
+
|
7
|
+
Your DataMapper resource might benefit from a state machine if it:
|
8
|
+
|
9
|
+
* has different "modes" of operation
|
10
|
+
* has discrete behaviors
|
11
|
+
* especially if the behaviors are mutually exclusive
|
12
|
+
|
13
|
+
And you want a clean, high-level way of describing these modes / behaviors
|
14
|
+
and how the resource moves between them. This plugin allows you to
|
15
|
+
declaratively describe the states and transitions involved.
|
16
|
+
|
17
|
+
== Installation
|
18
|
+
|
19
|
+
1. Download dm-more.
|
20
|
+
2. Install dm-is-state_machine using the supplied rake files.
|
21
|
+
|
22
|
+
== Setting up with Merb ##
|
23
|
+
|
24
|
+
Add this line to your init.rb:
|
25
|
+
|
26
|
+
dependency "dm-is-state_machine"
|
27
|
+
|
28
|
+
## Example DataMapper resource (i.e. model) ##
|
29
|
+
|
30
|
+
# /app/models/traffic_light.rb
|
31
|
+
class TrafficLight
|
32
|
+
include DataMapper::Resource
|
33
|
+
|
34
|
+
property :id, Serial
|
35
|
+
|
36
|
+
is :state_machine, :initial => :green, :column => :color do
|
37
|
+
state :green
|
38
|
+
state :yellow
|
39
|
+
state :red, :enter => :red_hook
|
40
|
+
state :broken
|
41
|
+
|
42
|
+
event :forward do
|
43
|
+
transition :from => :green, :to => :yellow
|
44
|
+
transition :from => :yellow, :to => :red
|
45
|
+
transition :from => :red, :to => :green
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def red_hook
|
50
|
+
# Do something
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
== What this gives you
|
55
|
+
|
56
|
+
=== Explained in words
|
57
|
+
|
58
|
+
The above DSL (domain specific language) does these things "behind the scenes":
|
59
|
+
|
60
|
+
1. Defines a DataMapper property called 'color'.
|
61
|
+
|
62
|
+
2. Makes the current state available by using 'traffic_light.color'.
|
63
|
+
|
64
|
+
3. Defines the 'forward!' transition method. This method triggers the
|
65
|
+
appropriate transition based on the current state and comparing it against
|
66
|
+
the various :from states. It will raise an error if you attempt to call
|
67
|
+
it with an invalid state (such as :broken, see above). After the method
|
68
|
+
runs successfully, the state machine will be left in the :to state.
|
69
|
+
|
70
|
+
=== Explained with some code examples
|
71
|
+
|
72
|
+
# Somewhere in your controller, perhaps
|
73
|
+
light = TrafficLight.new
|
74
|
+
|
75
|
+
# Move to the next state
|
76
|
+
light.forward!
|
77
|
+
|
78
|
+
# Do something based on the current state
|
79
|
+
case light.color
|
80
|
+
when "green"
|
81
|
+
# do something green-related
|
82
|
+
when "yellow"
|
83
|
+
# do something yellow-related
|
84
|
+
when "red"
|
85
|
+
# do something red-related
|
86
|
+
end
|
87
|
+
|
88
|
+
== Specific examples
|
89
|
+
|
90
|
+
We would also like to hear how *you* are using state machines in your code.
|
91
|
+
|
92
|
+
== See also
|
93
|
+
|
94
|
+
Here are some other projects you might want to look at. Most of them
|
95
|
+
are probably intended for ActiveRecord. They take different approaches,
|
96
|
+
which is pretty interesting. If you find something you like in these other
|
97
|
+
projects, let us know. Maybe we can incorporate some of your favorite parts.
|
98
|
+
That said, I do not want to create a Frankenstein. :)
|
99
|
+
|
100
|
+
* http://github.com/pluginaweek/state_machine/tree/master
|
101
|
+
* http://github.com/davidlee/stateful/tree/master
|
102
|
+
* http://github.com/sbfaulkner/has_states/tree/master
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/dm-is-state_machine/is/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'ardm-is-state_machine'
|
6
|
+
gem.version = DataMapper::Is::StateMachine::VERSION
|
7
|
+
|
8
|
+
gem.authors = [ 'Martin Emde', 'David James' ]
|
9
|
+
gem.email = [ 'me@martinemde.com', 'djwonk [a] collectiveinsight [d] net' ]
|
10
|
+
gem.summary = 'Ardm fork of dm-is-state_machine'
|
11
|
+
gem.description = 'DataMapper plugin for creating state machines'
|
12
|
+
gem.homepage = "https://github.com/ar-dm/ardm-is-state_machine"
|
13
|
+
gem.license = 'MIT'
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split("\n")
|
16
|
+
gem.test_files = `git ls-files -- {spec}/*`.split("\n")
|
17
|
+
gem.extra_rdoc_files = %w[LICENSE README.rdoc]
|
18
|
+
gem.require_paths = [ "lib" ]
|
19
|
+
|
20
|
+
gem.add_runtime_dependency 'ardm-core', '~> 1.2'
|
21
|
+
|
22
|
+
gem.add_development_dependency 'rake', '~> 0.9'
|
23
|
+
gem.add_development_dependency 'rspec', '~> 1.3'
|
24
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'dm-is-state_machine'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
require 'dm-is-state_machine/is/state_machine'
|
4
|
+
require 'dm-is-state_machine/is/data/event'
|
5
|
+
require 'dm-is-state_machine/is/data/machine'
|
6
|
+
require 'dm-is-state_machine/is/data/state'
|
7
|
+
require 'dm-is-state_machine/is/dsl/event_dsl'
|
8
|
+
require 'dm-is-state_machine/is/dsl/state_dsl'
|
9
|
+
|
10
|
+
DataMapper::Model.append_extensions DataMapper::Is::StateMachine
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Is
|
3
|
+
module StateMachine
|
4
|
+
module Data
|
5
|
+
|
6
|
+
class Event
|
7
|
+
|
8
|
+
attr_reader :name, :machine, :transitions
|
9
|
+
|
10
|
+
def initialize(name, machine)
|
11
|
+
@name = name
|
12
|
+
@machine = machine
|
13
|
+
@transitions = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_transition(from, to)
|
17
|
+
@transitions << { :from => from, :to => to }
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end # Data
|
23
|
+
end # StateMachine
|
24
|
+
end # Is
|
25
|
+
end # DataMapper
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Is
|
3
|
+
module StateMachine
|
4
|
+
module Data
|
5
|
+
|
6
|
+
# This Machine class represents one state machine.
|
7
|
+
#
|
8
|
+
# A model (i.e. a DataMapper resource) can have more than one Machine.
|
9
|
+
class Machine
|
10
|
+
|
11
|
+
# The property of the DM resource that will hold this Machine's
|
12
|
+
# state.
|
13
|
+
#
|
14
|
+
# TODO: change :column to :property
|
15
|
+
attr_accessor :column
|
16
|
+
|
17
|
+
# The initial value of this Machine's state
|
18
|
+
attr_accessor :initial
|
19
|
+
|
20
|
+
# The current value of this Machine's state
|
21
|
+
#
|
22
|
+
# This is the "primary control" of this Machine's state. All
|
23
|
+
# other methods key off the value of @current_state_name.
|
24
|
+
attr_accessor :current_state_name
|
25
|
+
|
26
|
+
attr_accessor :events
|
27
|
+
|
28
|
+
attr_accessor :states
|
29
|
+
|
30
|
+
def initialize(column, initial)
|
31
|
+
@column, @initial = column, initial
|
32
|
+
@events, @states = [], []
|
33
|
+
@current_state_name = initial
|
34
|
+
end
|
35
|
+
|
36
|
+
# Fire (activate) the event with name +event_name+
|
37
|
+
#
|
38
|
+
# @api public
|
39
|
+
def fire_event(event_name, resource)
|
40
|
+
unless event = find_event(event_name)
|
41
|
+
raise InvalidEvent, "Could not find event (#{event_name.inspect})"
|
42
|
+
end
|
43
|
+
transition = event.transitions.find do |t|
|
44
|
+
t[:from].to_s == @current_state_name.to_s
|
45
|
+
end
|
46
|
+
unless transition
|
47
|
+
raise InvalidEvent, "Event (#{event_name.inspect}) does not" +
|
48
|
+
"exist for current state (#{@current_state_name.inspect})"
|
49
|
+
end
|
50
|
+
|
51
|
+
# == Run :exit hook (if present) ==
|
52
|
+
resource.run_hook_if_present current_state.options[:exit]
|
53
|
+
|
54
|
+
# == Change the current_state ==
|
55
|
+
@current_state_name = transition[:to]
|
56
|
+
|
57
|
+
# == Run :enter hook (if present) ==
|
58
|
+
resource.run_hook_if_present current_state.options[:enter]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Return the current state
|
62
|
+
#
|
63
|
+
# @api public
|
64
|
+
def current_state
|
65
|
+
find_state(@current_state_name)
|
66
|
+
# TODO: add caching, i.e. with `@current_state ||= ...`
|
67
|
+
end
|
68
|
+
|
69
|
+
# Find event whose name is +event_name+
|
70
|
+
#
|
71
|
+
# @api semipublic
|
72
|
+
def find_event(event_name)
|
73
|
+
@events.find { |event| event.name.to_s == event_name.to_s }
|
74
|
+
# TODO: use a data structure that prevents duplicates
|
75
|
+
end
|
76
|
+
|
77
|
+
# Find state whose name is +event_name+
|
78
|
+
#
|
79
|
+
# @api semipublic
|
80
|
+
def find_state(state_name)
|
81
|
+
@states.find { |state| state.name.to_s == state_name.to_s }
|
82
|
+
# TODO: use a data structure that prevents duplicates
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end # Data
|
88
|
+
end # StateMachine
|
89
|
+
end # Is
|
90
|
+
end # DataMapper
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Is
|
3
|
+
module StateMachine
|
4
|
+
module Data
|
5
|
+
|
6
|
+
class State
|
7
|
+
|
8
|
+
attr_reader :name, :machine, :options
|
9
|
+
|
10
|
+
def initialize(name, machine, options = {})
|
11
|
+
@name = name
|
12
|
+
@options = options
|
13
|
+
@machine = machine
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end # Data
|
19
|
+
end # StateMachine
|
20
|
+
end # Is
|
21
|
+
end # DataMapper
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Is
|
3
|
+
module StateMachine
|
4
|
+
# Event DSL (Domain Specific Language)
|
5
|
+
module EventDsl
|
6
|
+
|
7
|
+
# Define an event. This takes a block which describes all valid
|
8
|
+
# transitions for this event.
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
#
|
12
|
+
# class TrafficLight
|
13
|
+
# include DataMapper::Resource
|
14
|
+
# property :id, Serial
|
15
|
+
# is :state_machine, :initial => :green, :column => :color do
|
16
|
+
# # state definitions go here...
|
17
|
+
#
|
18
|
+
# event :forward do
|
19
|
+
# transition :from => :green, :to => :yellow
|
20
|
+
# transition :from => :yellow, :to => :red
|
21
|
+
# transition :from => :red, :to => :green
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# +transition+ takes a hash where <tt>:to</tt> is the state to transition
|
27
|
+
# to and <tt>:from</tt> is a state (or Array of states) from which this
|
28
|
+
# event can be fired.
|
29
|
+
def event(name, &block)
|
30
|
+
unless state_machine_context?(:is)
|
31
|
+
raise InvalidContext, "Valid only in 'is :state_machine' block"
|
32
|
+
end
|
33
|
+
|
34
|
+
# ===== Setup context =====
|
35
|
+
machine = @is_state_machine[:machine]
|
36
|
+
event = Data::Event.new(name, machine)
|
37
|
+
machine.events << event
|
38
|
+
@is_state_machine[:event] = {
|
39
|
+
:name => name,
|
40
|
+
:object => event
|
41
|
+
}
|
42
|
+
push_state_machine_context(:event)
|
43
|
+
|
44
|
+
# ===== Define methods =====
|
45
|
+
define_method("#{name}!") do
|
46
|
+
transition!(name)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Possible alternative to the above:
|
50
|
+
# (class_eval is typically faster than define_method)
|
51
|
+
#
|
52
|
+
# self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
53
|
+
# def #{name}!
|
54
|
+
# machine.current_state_name = __send__(:"#{column}")
|
55
|
+
# machine.fire_event(name, self)
|
56
|
+
# __send__(:"#{column}="), machine.current_state_name
|
57
|
+
# end
|
58
|
+
# RUBY
|
59
|
+
|
60
|
+
yield if block_given?
|
61
|
+
|
62
|
+
# ===== Teardown context =====
|
63
|
+
pop_state_machine_context
|
64
|
+
end
|
65
|
+
|
66
|
+
def transition(options)
|
67
|
+
unless state_machine_context?(:event)
|
68
|
+
raise InvalidContext, "Valid only in 'event' block"
|
69
|
+
end
|
70
|
+
event_name = @is_state_machine[:event][:name]
|
71
|
+
event_object = @is_state_machine[:event][:object]
|
72
|
+
|
73
|
+
from = options[:from]
|
74
|
+
to = options[:to]
|
75
|
+
event_object.add_transition(from, to)
|
76
|
+
end
|
77
|
+
|
78
|
+
end # EventDsl
|
79
|
+
end # StateMachine
|
80
|
+
end # Is
|
81
|
+
end # DataMapper
|