         
         var dateComponents = DateComponents()
         dateComponents.month = offset;
-        
+    
         guard let newDate = self.calendar.date(byAdding: dateComponents, to: displayDate) else { return }
-        
         self.setDisplayDate(newDate, animated: true)
     }
-    
-    func goToNextMonth() {
+}
+
+// MARK: - Public methods
+extension CalendarView {
+    
+    /*
+     method: - reloadData
+     function: - reload all components in collection view
+     */
+    public func reloadData() {
+        self.collectionView.reloadData()
+    }
+    
+    /*
+     method: - setDisplayDate
+     params:
+     - date: Date to extract month and year to scroll at correct section;
+     - animated: to handle animation if want;
+     function: - scroll calendar at date (month/year) passed as parameter.
+     */
+    public func setDisplayDate(_ date : Date, animated: Bool = false) {
+        
+        guard (date > startDateCache) && (date < endDateCache) else { return }
+        self.collectionView.setContentOffset(self.scrollViewOffset(for: date), animated: animated)
+        self.displayDateOnHeader(date)
+    }
+    
+    /*
+     TODO
+     */
+    public func selectDate(_ date : Date) {
+        guard let indexPath = self.indexPathForDate(date) else { return }
+        self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
+        self.collectionView(collectionView, didSelectItemAt: indexPath)
+    }
+    
+    /*
+     TODO
+     */
+    public func deselectDate(_ date : Date) {
+        guard let indexPath = self.indexPathForDate(date) else { return }
+        self.collectionView.deselectItem(at: indexPath, animated: false)
+        self.collectionView(collectionView, didSelectItemAt: indexPath)
+    }
+    
+    /*
+     TODO
+     */
+    public func goToNextMonth() {
         goToMonthWithOffet(1)
     }
     
-    func goToPreviousMonth() {
+    /*
+     TODO
+     */
+    public func goToPreviousMonth() {
         goToMonthWithOffet(-1)
     }
 }

            let month = distanceFromStartDate.month,
            let (firstDayIndex, _) = monthInfoForSection[month] else { return nil }
        
        return IndexPath(
            item: day + firstDayIndex,
            section: month
        )
        
    }
    
    func dateFromIndexPath(_ indexPath: IndexPath) -> Date? {


public protocol CalendarViewDelegate {
    
    func calendar(_ calendar : CalendarView, didScrollToMonth date : Date) -> Void
    func calendar(_ calendar : CalendarView, didSelectDate date : Date, withEvents events: [CalendarEvent]) -> Void
    /* optional */
    func calendar(_ calendar : CalendarView, canSelectDate date : Date) -> Bool
    func calendar(_ calendar : CalendarView, didDeselectDate date : Date) -> Void
}

extension CalendarViewDelegate {
