Created
January 22, 2010 13:06
-
-
Save panesofglass/283751 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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