                 // Begin again, if conditions met
                 if (self.labelShouldScroll() && !self.tapToScroll && !self.holdScrolling) {
                     // Perform completion callback
-                    callback(self)(interval: interval, delay: delay)
+                    self.scroll(interval, delay: delay, scroller: scroller, fader: gradientAnimation)
                 }
             }
         })
         
         // Call scroller
-        let scrolls = scroller(interval: interval, delay: delay)
+        let scrolls = scroller.generate(interval, delay: delay)
         
         // Perform all animations in scrolls
         for (index, scroll) in scrolls.enumerate() {

    // Define animation completion closure type
    private typealias MLAnimationCompletion = (finished: Bool) -> ()
    
    private func scroll(interval: CGFloat,
        delay: CGFloat = 0.0,
        scroller: (interval: CGFloat, delay: CGFloat) -> [(layer: CALayer, anim: CAKeyframeAnimation)],
        callback: MarqueeLabel -> (interval: CGFloat, delay: CGFloat) -> ())
    {
        
        // Check for conditions which would prevent scrolling
        if !labelReadyForScroll() {
            return

            
            // Call returned home function
            self.labelReturnedToHome(true)
            
            // Check to ensure that:
            // 1) We don't double fire if an animation already exists
            // 2) The instance is still attached to a window - this completion block is called for
