 /**
  Responsible for managing the queue of animations and their sequencing.
  */
-struct DaisyChain {
+class DaisyChain {
     
     private let queue: dispatch_queue_t
     private var semaphore: dispatch_semaphore_t

                            this block is performed at the beginning of the next run loop cycle.
                            This parameter may be `NULL`.
    */
    internal mutating func animateWithDuration(duration: NSTimeInterval, delay: NSTimeInterval, options: UIViewAnimationOptions, animations: () -> Void, completion: ((Bool) -> Void)?) {
        performAndWait {
            UIView.animateWithDuration(duration, delay: delay, options: options, animations: animations, completion: { finished in
                self.resume(completion, finished: finished)

                                        cycle. This parameter may be `NULL`.
     */

    internal func animateWithDuration(duration: NSTimeInterval, delay: NSTimeInterval, usingSpringWithDamping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions, animations: () -> Void, completion: ((Bool) -> Void)?) {
        performAndWait {
            UIView.animateWithDuration(duration, delay: delay, options: options, animations: animations, completion: { finished -> Void in
                self.resume(completion, finished: finished)
