       describe "when already animating", ->
         beforeEach ->
           a.animating = true
-        for f in [before]
-          it "does not call '#{f}'", ->
-            a._animate(before, animation, after, eventname)
-            expect(before).not.toHaveBeenCalled()
+          it "does not call the animation", ->
+            a._animate(animation, eventname)
+            expect(animation).not.toHaveBeenCalled()
 
       describe "when not already animating", ->
         beforeEach ->
           a.animating = false
           a.$picker = jasmine.createSpy("picker mock")
-          a.$picker.trigger = jasmine.createSpy('trigger mock')
 
-        for f in [before, animation, after]
-          it "does not call '#{f}'", ->
-            a._animate(before, animation, after, eventname)
-            expect(before).toHaveBeenCalled()
+        it "sets @animating to true", ->
+          a._animate(animation, eventname)
+          expect(a.animating).toBe(true)
 
-        it "triggers the 'eventName' event", ->
-          a._animate(before, animation, after, eventname)
-          expect(a.$picker.trigger).toHaveBeenCalledWith(eventname)
+        it "sets @currentEventName to the given event name so we can trigger it later", ->
+          a._animate(animation, eventname)
+          expect(a.currentEventName).toBe(eventname)
+
+        describe "if animation is a function", ->
+          it "calls the animation", ->
+            spyOn(animation, 'apply')
+            a._animate(animation, eventname)
+            expect(animation.apply).toHaveBeenCalledWith(a, [a.pickerManager])
+
+        describe "if animation is not a function", ->
+          it "does not call the animation", ->
+            spyOn(animation, 'apply')
+            a._animate("not a function", eventname)
+            expect(animation.apply).not.toHaveBeenCalled()
 
 
     describe "#_setElements", ->


  describe "#previousMonth", ->
    describe "when given custom animations", ->
      pmp = jasmine.createSpy("previousMonthPrepare mock")
      pma = jasmine.createSpy("previousMonth mock")
      pmc = jasmine.createSpy("previousMonthCallback mock")
      beforeEach ->
        options =
          previousMonthPrepare: pmp
          previousMonth: pma
          previousMonthCallback: pmc
        a = new chronos.Animator(pm, options)

      it "calls animate with the correct arguments", ->
        spyOn(a, '_animate')
        a.previousMonth()
        expect(a._animate).toHaveBeenCalledWith(pmp, pma, pmc, 'previousMonthFinished')

    describe "without custom animations", ->
      beforeEach ->

      it "calls animate with the defaults", ->
        spyOn(a, '_animate')
        spyOn(a, '_animatePreviousMonth')
        a.previousMonth()
        expect(a._animate).toHaveBeenCalledWith(a._animatePreviousMonth,
          'previousMonthFinished')


  describe "#nextMonth", ->
    describe "when given custom animations", ->
      animation = jasmine.createSpy('custom animation mock')
      beforeEach ->
        options =
          nextMonth: animation
        a = new chronos.Animator(pm, options)

      it "calls animate with the correct arguments", ->
        spyOn(a, '_animate')
        a.nextMonth()
        expect(a._animate).toHaveBeenCalledWith(animation, 'nextMonthFinished')

    describe "without custom animations", ->
      beforeEach ->
