$30 off During Our Annual Pro Sale. View Details »

Heteromorphic Fantasy: Obie's state_machine (2012)

Rob Howard
February 05, 2012

Heteromorphic Fantasy: Obie's state_machine (2012)

A walk-through of state machines with @obie's gem.

Code examples here: https://github.com/damncabbage/state_machine_example

Rob Howard

February 05, 2012
Tweet

More Decks by Rob Howard

Other Decks in Technology

Transcript

  1. Heteromorphic
    Fantasy
    @obrie’s state_machine

    View Slide

  2. View Slide

  3. machine?
    state
    What is a

    View Slide

  4. :caterpillar

    View Slide

  5. :pupa

    View Slide

  6. View Slide

  7. Caterpillar

    View Slide

  8. Caterpillar Pupa

    View Slide

  9. Caterpillar Pupa
    Eldritch
    Horror

    View Slide

  10. Caterpillar Pupa
    Pupate
    Eldritch
    Horror
    Emerge

    View Slide

  11. Let’s find a
    tamer
    example.

    View Slide

  12. Vending Machine

    View Slide

  13. state_machine

    View Slide

  14. :idle
    :awaiting
    selection
    push_button
    insert_dollar

    View Slide

  15. state :idle
    # Free:
    v.state == :idle
    v.idle?

    View Slide

  16. event :push_button
    # Free:
    v.can_push_button?

    View Slide

  17. :idle
    :awaiting
    selection
    push_button
    insert_dollar

    View Slide

  18. :idle
    :awaiting
    selection
    push_button
    insert_dollar
    :accepting
    money
    insert_dollar
    insert_dollar
    insert_dollar

    View Slide

  19. :idle
    :awaiting
    selection
    push_button
    insert_dollar
    :accepting
    money
    insert_dollar
    insert_dollar
    insert_dollar
    crowbar
    :broken

    View Slide

  20. Extra Goodies

    View Slide

  21. Per-State
    class_eval

    View Slide

  22. state :details do
    validates :name, :presence => true
    validates :email, :presence => true
    end
    state :shipping do
    validates :address, :presence => true
    end

    View Slide

  23. state :on do
    def volume
    dial_rotation * 100 / max_rotation
    end
    end
    state :mute do
    def volume
    0
    end
    end

    View Slide

  24. Multiple State
    Machines

    View Slide

  25. state_machine :state do
    state :idle
    state :awaiting_selection
    end
    state_machine :coin_slot do
    state :open
    state :closed
    end

    View Slide

  26. State Values

    View Slide

  27. state_machine :alarm do
    state :on, :value => 1
    state :off, :value => 0
    end

    View Slide

  28. Real World
    Where can I find some
    Examples
    already?

    View Slide

  29. Spree Commerce
    http://github.com/spree/spree

    View Slide

  30. state_machine :initial => 'cart', :use_transactions => false do
    event :next do
    transition :from => 'cart', :to => 'address'
    transition :from => 'address', :to => 'delivery'
    transition :from => 'delivery', :to => 'payment', :if => :payment_required?
    transition :from => 'delivery', :to => 'complete'
    transition :from => 'confirm', :to => 'complete'
    transition :from => 'payment', :to => 'confirm',
    :if => Proc.new { |order| order.payment_method &&
    order.payment_method.payment_profiles_supported? }
    transition :from => 'payment', :to => 'complete'
    end
    event :cancel { transition :to => 'canceled', :if => :allow_cancel? }
    event :return { transition :to => 'returned', :from => 'awaiting_return' }
    event :resume { transition :to => 'resumed', :from => 'canceled', :if => :allow_resume? }
    event :authorize_return { transition :to => 'awaiting_return' }
    before_transition :to => 'complete' { |order| order.process_payments! }
    before_transition :to => ['delivery'] do |order|
    order.shipments.each { |s| s.destroy unless s.shipping_method.available_to_order?(order) }
    end
    after_transition :to => 'complete', :do => :finalize!
    after_transition :to => 'delivery', :do => :create_tax_charge!
    after_transition :to => 'payment', :do => :create_shipment!
    after_transition :to => 'resumed', :do => :after_resume
    after_transition :to => 'canceled', :do => :after_cancel
    end

    View Slide

  31. @damncabbage
    http://robhoward.id.au
    obrie/state_machine
    damncabbage/state_machine_example
    GitHub

    View Slide