mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
195 lines
3.9 KiB
Ruby
195 lines
3.9 KiB
Ruby
Dir[File.dirname(__FILE__) + "/../models/*.rb"].each { |f| require File.expand_path(f) }
|
|
|
|
class Foo
|
|
include AASM
|
|
aasm do
|
|
state :open, :initial => true, :exit => :exit
|
|
state :closed, :enter => :enter
|
|
|
|
event :close, :success => :success_callback do
|
|
transitions :to => :closed, :from => [:open]
|
|
end
|
|
|
|
event :null do
|
|
transitions :to => :closed, :from => [:open], :guard => :always_false
|
|
end
|
|
end
|
|
|
|
def always_false
|
|
false
|
|
end
|
|
|
|
def success_callback
|
|
end
|
|
|
|
def enter
|
|
end
|
|
def exit
|
|
end
|
|
end
|
|
|
|
class FooTwo < Foo
|
|
include AASM
|
|
aasm do
|
|
state :foo
|
|
end
|
|
end
|
|
|
|
class Bar
|
|
include AASM
|
|
|
|
aasm do
|
|
state :read
|
|
state :ended
|
|
|
|
event :foo do
|
|
transitions :to => :ended, :from => [:read]
|
|
end
|
|
end
|
|
end
|
|
|
|
class Baz < Bar
|
|
end
|
|
|
|
class Banker
|
|
include AASM
|
|
aasm do
|
|
state :retired
|
|
state :selling_bad_mortgages
|
|
end
|
|
aasm_initial_state Proc.new { |banker| banker.rich? ? :retired : :selling_bad_mortgages }
|
|
RICH = 1_000_000
|
|
attr_accessor :balance
|
|
def initialize(balance = 0); self.balance = balance; end
|
|
def rich?; self.balance >= RICH; end
|
|
end
|
|
|
|
class Argument
|
|
include AASM
|
|
aasm do
|
|
state :invalid, :initial => true
|
|
state :valid
|
|
|
|
event :valid do
|
|
transitions :to => :valid, :from => [:invalid]
|
|
end
|
|
end
|
|
end
|
|
|
|
class AuthMachine
|
|
include AASM
|
|
|
|
attr_accessor :activation_code, :activated_at, :deleted_at
|
|
|
|
aasm do
|
|
state :passive
|
|
state :pending, :initial => true, :enter => :make_activation_code
|
|
state :active, :enter => :do_activate
|
|
state :suspended
|
|
state :deleted, :enter => :do_delete, :exit => :do_undelete
|
|
|
|
event :register do
|
|
transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| u.can_register? }
|
|
end
|
|
|
|
event :activate do
|
|
transitions :from => :pending, :to => :active
|
|
end
|
|
|
|
event :suspend do
|
|
transitions :from => [:passive, :pending, :active], :to => :suspended
|
|
end
|
|
|
|
event :delete do
|
|
transitions :from => [:passive, :pending, :active, :suspended], :to => :deleted
|
|
end
|
|
|
|
# a dummy event that can never happen
|
|
event :unpassify do
|
|
transitions :from => :passive, :to => :active, :guard => Proc.new {|u| false }
|
|
end
|
|
|
|
event :unsuspend do
|
|
transitions :from => :suspended, :to => :active, :guard => Proc.new {|u| u.has_activated? }
|
|
transitions :from => :suspended, :to => :pending, :guard => Proc.new {|u| u.has_activation_code? }
|
|
transitions :from => :suspended, :to => :passive
|
|
end
|
|
end
|
|
|
|
def initialize
|
|
# the AR backend uses a before_validate_on_create :aasm_ensure_initial_state
|
|
# lets do something similar here for testing purposes.
|
|
aasm_enter_initial_state
|
|
end
|
|
|
|
def make_activation_code
|
|
@activation_code = 'moo'
|
|
end
|
|
|
|
def do_activate
|
|
@activated_at = Time.now
|
|
@activation_code = nil
|
|
end
|
|
|
|
def do_delete
|
|
@deleted_at = Time.now
|
|
end
|
|
|
|
def do_undelete
|
|
@deleted_at = false
|
|
end
|
|
|
|
def can_register?
|
|
true
|
|
end
|
|
|
|
def has_activated?
|
|
!!@activated_at
|
|
end
|
|
|
|
def has_activation_code?
|
|
!!@activation_code
|
|
end
|
|
end
|
|
|
|
class ThisNameBetterNotBeInUse
|
|
include AASM
|
|
|
|
aasm do
|
|
state :initial
|
|
state :symbol
|
|
state :string
|
|
state :array
|
|
state :proc
|
|
end
|
|
end
|
|
|
|
class ChetanPatil
|
|
include AASM
|
|
aasm do
|
|
state :sleeping, :initial => true
|
|
state :showering
|
|
state :working
|
|
state :dating
|
|
state :prettying_up
|
|
|
|
event :wakeup do
|
|
transitions :from => :sleeping, :to => [:showering, :working]
|
|
end
|
|
|
|
event :dress do
|
|
transitions :from => :sleeping, :to => :working, :on_transition => :wear_clothes
|
|
transitions :from => :showering, :to => [:working, :dating], :on_transition => Proc.new { |obj, *args| obj.wear_clothes(*args) }
|
|
transitions :from => :showering, :to => :prettying_up, :on_transition => [:condition_hair, :fix_hair]
|
|
end
|
|
end
|
|
|
|
def wear_clothes(shirt_color, trouser_type)
|
|
end
|
|
|
|
def condition_hair
|
|
end
|
|
|
|
def fix_hair
|
|
end
|
|
end
|