<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/functional/auth_machine_test.rb</filename>
    </added>
    <added>
      <filename>test/test_helper.rb</filename>
    </added>
    <added>
      <filename>test/unit/aasm_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/event_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/state_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/state_transition_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -2,6 +2,7 @@
 *.sw?
 *~
 .DS_Store
+.idea
 coverage
 pkg
 rdoc</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,7 @@ begin
     gem.authors = [&quot;Scott Barron&quot;, &quot;Scott Petersen&quot;, &quot;Travis Tilley&quot;]
     gem.email = &quot;ttilley@gmail.com&quot;
     gem.add_development_dependency &quot;rspec&quot;
+    gem.add_development_dependency &quot;shoulda&quot;
     gem.add_development_dependency 'sdoc'
     # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
   end
@@ -20,18 +21,40 @@ rescue LoadError
 end
 
 require 'spec/rake/spectask'
+require 'rake/testtask'
+
+Rake::TestTask.new(:test) do |test|
+  test.libs &lt;&lt; 'lib' &lt;&lt; 'test'
+  test.pattern = 'test/**/*_test.rb'
+  test.verbose = true
+end
+
+begin
+  require 'rcov/rcovtask'
+  Rcov::RcovTask.new(:rcov_shoulda) do |test|
+    test.libs &lt;&lt; 'test'
+    test.pattern = 'test/**/*_test.rb'
+    test.verbose = true
+  end
+rescue LoadError
+  task :rcov do
+    abort &quot;RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov&quot;
+  end
+end
+
 Spec::Rake::SpecTask.new(:spec) do |spec|
   spec.libs &lt;&lt; 'lib' &lt;&lt; 'spec'
   spec.spec_files = FileList['spec/**/*_spec.rb']
   spec.spec_opts = ['-cfs']
 end
 
-Spec::Rake::SpecTask.new(:rcov) do |spec|
+Spec::Rake::SpecTask.new(:rcov_rspec) do |spec|
   spec.libs &lt;&lt; 'lib' &lt;&lt; 'spec'
   spec.pattern = 'spec/**/*_spec.rb'
   spec.rcov = true
 end
 
+task :test =&gt; :check_dependencies
 task :spec =&gt; :check_dependencies
 
 begin
@@ -59,7 +82,7 @@ rescue LoadError
   end
 end
 
-task :default =&gt; :spec
+task :default =&gt; :test
 
 begin
   require 'rake/rdoctask'</diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -84,7 +84,20 @@ module AASM
       @aasm_current_state = aasm_read_state
     end
     return @aasm_current_state if @aasm_current_state
-    aasm_determine_state_name(self.class.aasm_initial_state)
+
+    aasm_enter_initial_state
+  end
+
+  def aasm_enter_initial_state
+    state_name = aasm_determine_state_name(self.class.aasm_initial_state)
+    state = aasm_state_object_for_state(state_name)
+
+    state.call_action(:before_enter, self)
+    state.call_action(:enter, self)
+    self.aasm_current_state = state_name
+    state.call_action(:after_enter, self)
+
+    state_name
   end
 
   def aasm_events_for_current_state
@@ -97,6 +110,7 @@ module AASM
   end
 
   private
+
   def set_aasm_current_state_with_persistence(state)
     save_success = true
     if self.respond_to?(:aasm_write_state) || self.private_methods.include?('aasm_write_state')
@@ -116,12 +130,12 @@ module AASM
 
   def aasm_determine_state_name(state)
     case state
-    when Symbol, String
-      state
-    when Proc
-      state.call(self)
-    else
-      raise NotImplementedError, &quot;Unrecognized state-type given.  Expected Symbol, String, or Proc.&quot;
+      when Symbol, String
+        state
+      when Proc
+        state.call(self)
+      else
+        raise NotImplementedError, &quot;Unrecognized state-type given.  Expected Symbol, String, or Proc.&quot;
     end
   end
 
@@ -144,13 +158,13 @@ module AASM
 
     unless new_state_name.nil?
       new_state = aasm_state_object_for_state(new_state_name)
-    
+
       # new before_ callbacks
       old_state.call_action(:before_exit, self)
       new_state.call_action(:before_enter, self)
-      
+
       new_state.call_action(:enter, self)
-      
+
       persist_successful = true
       if persist
         persist_successful = set_aasm_current_state_with_persistence(new_state_name)
@@ -159,7 +173,7 @@ module AASM
         self.aasm_current_state = new_state_name
       end
 
-      if persist_successful 
+      if persist_successful
         old_state.call_action(:after_exit, self)
         new_state.call_action(:after_enter, self)
         event.call_action(:after, self)</diff>
      <filename>lib/aasm/aasm.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,13 +4,11 @@ module AASM
   module SupportingClasses
     class Event
       attr_reader :name, :success, :options
-      
+
       def initialize(name, options = {}, &amp;block)
         @name = name
-        @success = options[:success]
         @transitions = []
-        @options = options
-        instance_eval(&amp;block) if block
+        update(options, &amp;block)
       end
 
       def fire(obj, to_state=nil, *args)
@@ -37,35 +35,59 @@ module AASM
         @transitions.select { |t| t.from == state }
       end
 
-      def execute_success_callback(obj, success = nil)
-        callback = success || @success
-        case(callback)
-        when String, Symbol
-          obj.send(callback)
-        when Proc
-          callback.call(obj)
-        when Array
-          callback.each{|meth|self.execute_success_callback(obj, meth)}
-        end
+      def all_transitions
+        @transitions
       end
 
       def call_action(action, record)
         action = @options[action]
-        case action
-        when Symbol, String
-          record.send(action)
-        when Proc
-          action.call(record)
-        when Array
-          action.each { |a| record.send(a) }
+        action.is_a?(Array) ?
+                action.each {|a| _call_action(a, record)} :
+                _call_action(action, record)
+      end
+
+      def ==(event)
+        if event.is_a? Symbol
+          name == event
+        else
+          name == event.name
         end
       end
 
-      def all_transitions
-        @transitions
+      def update(options = {}, &amp;block)
+        if options.key?(:success) then
+          @success = options[:success]
+        end
+        if block then
+          instance_eval(&amp;block)
+        end
+        @options = options
+        self
+      end
+
+      def execute_success_callback(obj, success = nil)
+        callback = success || @success
+        case(callback)
+          when String, Symbol
+            obj.send(callback)
+          when Proc
+            callback.call(obj)
+          when Array
+            callback.each{|meth|self.execute_success_callback(obj, meth)}
+        end
       end
 
       private
+
+      def _call_action(action, record)
+        case action
+          when Symbol, String
+            record.send(action)
+          when Proc
+            action.call(record)
+        end
+      end
+
       def transitions(trans_opts)
         Array(trans_opts[:from]).each do |s|
           @transitions &lt;&lt; SupportingClasses::StateTransition.new(trans_opts.merge({:from =&gt; s.to_sym}))</diff>
      <filename>lib/aasm/event.rb</filename>
    </modified>
    <modified>
      <diff>@@ -155,7 +155,7 @@ module AASM
         #   foo.aasm_state # =&gt; nil
         #
         def aasm_ensure_initial_state
-          send(&quot;#{self.class.aasm_column}=&quot;, self.aasm_current_state.to_s)
+          send(&quot;#{self.class.aasm_column}=&quot;, self.aasm_enter_initial_state.to_s)
         end
 
       end</diff>
      <filename>lib/aasm/persistence/active_record_persistence.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,8 @@ module AASM
       attr_reader :name, :options
 
       def initialize(name, options={})
-        @name, @options = name, options
+        @name = name
+        update(options)
       end
 
       def ==(state)
@@ -17,30 +18,38 @@ module AASM
 
       def call_action(action, record)
         action = @options[action]
-        if action.is_a? Array
-          action.each do |a|
-            _call(a, record)
-          end
-        else
-          _call(action, record)
-        end
+        action.is_a?(Array) ?
+                action.each {|a| _call_action(a, record)} :
+                _call_action(action, record)
+      end
+
+      def display_name
+        @display_name ||= name.to_s.gsub(/_/, ' ').capitalize
       end
 
       def for_select
-        [name.to_s.gsub(/_/, ' ').capitalize, name.to_s]
+        [display_name, name.to_s]
+      end
+
+      def update(options = {})
+        if options.key?(:display) then
+          @display_name = options.delete(:display)
+        end
+        @options = options
+        self
       end
-      
+
       private
-      def _call(action, record)
+
+      def _call_action(action, record)
         case action
-        when Symbol, String
-          record.send(action)
-        when Proc
-          action.call(record)
-        when Array
-          action.each { |a| record.send(a) }
+          when Symbol, String
+            record.send(action)
+          when Proc
+            action.call(record)
         end
       end
+
     end
   end
 end</diff>
      <filename>lib/aasm/state.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@ module AASM
     attr_reader :name
 
     def initialize(name)
-      @name   = name
+      @name = name
       @initial_state = nil
       @states = []
       @events = {}</diff>
      <filename>lib/aasm/state_machine.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@ module AASM
   module SupportingClasses
     class StateTransition
       attr_reader :from, :to, :opts
+      alias_method :options, :opts
 
       def initialize(opts)
         @from, @to, @guard, @on_transition = opts[:from], opts[:to], opts[:guard], opts[:on_transition]
@@ -10,29 +11,40 @@ module AASM
 
       def perform(obj)
         case @guard
-        when Symbol, String
-          obj.send(@guard)
-        when Proc
-          @guard.call(obj)
-        else
-          true
+          when Symbol, String
+            obj.send(@guard)
+          when Proc
+            @guard.call(obj)
+          else
+            true
         end
       end
 
       def execute(obj, *args)
-        case @on_transition
-        when Symbol, String
-          obj.send(@on_transition, *args)
-        when Array
-          @on_transition.each{|m| obj.send(m, *args) }
-        when Proc
-          @on_transition.call(obj, *args)
-        end
+        @on_transition.is_a?(Array) ?
+                @on_transition.each {|ot| _execute(obj, ot, *args)} :
+                _execute(obj, @on_transition, *args)
       end
 
       def ==(obj)
         @from == obj.from &amp;&amp; @to == obj.to
       end
+
+      def from?(value)
+        @from == value
+      end
+
+      private
+
+      def _execute(obj, on_transition, *args)
+        case on_transition
+          when Symbol, String
+            obj.send(on_transition, *args)
+          when Proc
+            on_transition.call(obj, *args)
+        end
+      end
+
     end
   end
 end</diff>
      <filename>lib/aasm/state_transition.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>80d7896eced7981acae301a8ed8f93cb36932804</id>
    </parent>
  </parents>
  <author>
    <name>Travis Tilley</name>
    <email>ttilley@gmail.com</email>
  </author>
  <url>http://github.com/rubyist/aasm/commit/dc002d4684a481fed59c88b4916f7b0c29354d96</url>
  <id>dc002d4684a481fed59c88b4916f7b0c29354d96</id>
  <committed-date>2009-10-19T11:38:59-07:00</committed-date>
  <authored-date>2009-10-14T21:34:08-07:00</authored-date>
  <message>cleanup, some refactoring, additional tests (one modeled after a common use of AASM, from restful authentication), fire callbacks on entering initial state, whitespace</message>
  <tree>6d295e85a701d2379577eb96d4231d390e1d26e9</tree>
  <committer>
    <name>Travis Tilley</name>
    <email>ttilley@gmail.com</email>
  </committer>
</commit>
