diff --git a/lib/finite_machine/state_machine.rb b/lib/finite_machine/state_machine.rb
index <HASH>..<HASH> 100644
--- a/lib/finite_machine/state_machine.rb
+++ b/lib/finite_machine/state_machine.rb
@@ -306,15 +306,21 @@ module FiniteMachine
           end
 
           notify HookEvent::Enter, event_transition, *data
+        end
+        notify HookEvent::After, event_transition, *data
 
-          notify HookEvent::After, event_transition, *data
-
-          event_transition.same?(state) ? NOTRANSITION : SUCCEEDED
-        else
-          notify HookEvent::After, event_transition, *data
+        infer_code(event_transition)
+      end
+    end
 
-          CANCELLED
-        end
+    # @api private
+    def infer_code(event_transition)
+      if event_transition.cancelled?
+        CANCELLED
+      elsif event_transition.same?(current)
+        NOTRANSITION
+      else
+        SUCCEEDED
       end
     end
 
diff --git a/spec/unit/events_spec.rb b/spec/unit/events_spec.rb
index <HASH>..<HASH> 100644
--- a/spec/unit/events_spec.rb
+++ b/spec/unit/events_spec.rb
@@ -314,7 +314,7 @@ RSpec.describe FiniteMachine, 'events' do
       }
 
       callbacks {
-        on_before(:drive) { }
+        on_before(:drive) { FiniteMachine::CANCELLED }
         on_after(:stop)   { }
       }
     end
Fix bug - ability to cancel inside callback.