Skip to content

Instantly share code, notes, and snippets.

@panesofglass
Created January 22, 2010 13:06
Show Gist options
  • Select an option

  • Save panesofglass/283751 to your computer and use it in GitHub Desktop.

Select an option

Save panesofglass/283751 to your computer and use it in GitHub Desktop.
using System;
using MvcContrib;
using Stateless;
namespace StatelessResfulie
{
public class Order
{
public enum Trigger { Self, Retrieve, Receipt, Cancel, Pay, Update }
public enum State { IsReady, Delivered, Unpaid, Cancelled, Paid }
private readonly StateMachine<State, RestfulieTrigger<Trigger>> _transitions;
public int Id { get; set; }
public Order()
{
_transitions = new StateMachine<State, RestfulieTrigger<Trigger>>(State.Unpaid);
_transitions.Configure(State.Unpaid)
.PermitReentry(Trigger.Self.At(controller => "orders", action => "show", id => Id))
.Permit(Trigger.Cancel.At(controller => "orders", action => "cancel", id => Id), State.Cancelled)
.Permit(Trigger.Pay.At(controller => "payments", action => "pay", id => Id), State.Paid)
.PermitReentry(Trigger.Update.At(controller => "orders", action => "update", id => Id));
_transitions.Configure(State.IsReady)
.PermitReentry(Trigger.Self.At(controller => "orders", action => "show", id => Id))
.Permit(Trigger.Retrieve.At(controller => "orders", action => "deliver", id => Id), State.Delivered)
.PermitReentry(Trigger.Update.At(controller => "orders", action => "update", id => Id));
_transitions.Configure(State.Delivered)
.PermitReentry(Trigger.Self.At(controller => "orders", action => "show", id => Id))
.PermitReentry(Trigger.Receipt.At(controller => "payments", action => "receipt", id => Id))
.PermitReentry(Trigger.Update.At(controller => "orders", action => "update", id => Id));
}
}
public class RestfulieTrigger<TTrigger>
{
public TTrigger Trigger { get; private set; }
public Hash Route { get; private set; }
internal RestfulieTrigger(TTrigger trigger, Hash route)
{
Trigger = trigger;
Route = route;
}
}
public static class RestfulieTriggerBuilder
{
public static RestfulieTrigger<TTrigger> At<TTrigger>(this TTrigger trigger, params Func<object, object>[] hash)
{
return new RestfulieTrigger<TTrigger>(trigger, new Hash(hash));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment