    
    fileprivate var _cvLeadingSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint()
    fileprivate var _animatingIndexPaths: [IndexPath]?
-   fileprivate var _needsReload: Bool = false
-   fileprivate var _needsLayout: Bool = false
-   fileprivate var _needsAnimatedLayout: Bool = false
    fileprivate var _elements: [Elemental] = []
+   
+   struct ReloadState {
+      var needsReload = false
+      var transition: ElementalTransition = .none
+      
+      mutating func reset() {
+         self = ReloadState()
+      }
+   }
+   fileprivate var _reloadState = ReloadState()
+   
+   struct LayoutState {
+      var needsLayout = false
+      var animated = false
+      
+      mutating func reset() {
+         self = LayoutState()
+      }
+   }
+   fileprivate var _layoutState = LayoutState()
    
    // MARK: - Public Properties
    public var footerViewTopPadding: CGFloat = 0 {

      }, completion: { _ in
         self._animatingIndexPaths = nil
      })
   }
}


      return true
   }
   
   open func reload(transition: ElementalTransition? = nil) {
      loadViewIfNeeded()
      let transition = transition ?? _reloadState.transition
      configure(with: generateElements() ?? _elements, transition: transition, scrollToTop: false)
      _reloadState.reset()
   }
   
   public func setNeedsReload(transition: ElementalTransition? = nil) {
      guard !_reloadState.needsReload else { return }
      _reloadState.needsReload = true
      
      if let transition = transition {
         _reloadState.transition = transition
      }
      DispatchQueue.main.async {
         guard self._reloadState.needsReload else { return }
         self.reload(transition: self._reloadState.transition)
      }
   }
   
   public func setNeedsLayout(animated: Bool = true) {
      _layoutState.animated = _layoutState.animated || animated
      guard !_layoutState.needsLayout else { return }
      _layoutState.needsLayout = true
      DispatchQueue.main.async {
         guard self._layoutState.needsLayout else { return }
         self.reloadLayout(animated: self._layoutState.animated)
      }
   }
   
