 open class CollectionComposer: BaseCollectionProvider {
 
   public var sections: [AnyCollectionProvider] {
+    get { return dataProvider.data }
+    set { dataProvider.data = newValue }
+  }
+
+  public var presenter: CollectionPresenter? {
     didSet {
       setNeedsReload()
     }
   }
-
-  fileprivate var sectionBeginIndex: [Int] = []
-  fileprivate var sectionForIndex: [Int] = []
-
-  fileprivate var currentSections: [AnyCollectionProvider] = []
-
-  public var presenter: CollectionPresenter? { didSet { setNeedsReload() } }
 
   public var layout: CollectionLayout<AnyCollectionProvider> {
     didSet {

    }
  }

  public init(identifier: String? = nil,
              layout: CollectionLayout<AnyCollectionProvider> = FlowLayout(),
              presenter: CollectionPresenter? = nil,
              sections: [AnyCollectionProvider]) {
    self.sections = sections
    self.presenter = presenter
    self.layout = layout
    super.init(identifier: identifier)
  }


  }

  func indexPath(_ index: Int) -> (Int, Int) {
    let sectionIndex = sectionBeginIndex.binarySearch { $0 <= index } - 1
    return (sectionIndex, index - sectionBeginIndex[sectionIndex])
  }

  open override var numberOfItems: Int {
    return (sectionBeginIndex.last ?? 0) + (sections.last?.numberOfItems ?? 0)
  }

  open override func view(at: Int) -> UIView {
    let (sectionIndex, item) = indexPath(at)
    return sections[sectionIndex].view(at: item)
  }

  open override func update(view: UIView, at: Int) {
    let (sectionIndex, item) = indexPath(at)
    sections[sectionIndex].update(view: view, at: item)
  }

  open override func identifier(at: Int) -> String {
    let (sectionIndex, item) = indexPath(at)
    let sectionIdentifier = sections[sectionIndex].identifier ?? "\(sectionIndex)"
    return "\(sectionIdentifier)." + sections[sectionIndex].identifier(at: item)
  }

  open override func layout(collectionSize: CGSize) {
    layout.layout(
      collectionSize: collectionSize,
      dataProvider: dataProvider,
      sizeProvider: { (_, data, collectionSize) in
        data.layout(collectionSize: collectionSize)
        return data.contentSize
