 		closeSection(footerBlock)
 	}
 	
+	
+	// MARK: SectionFormItem
+	
+	func visit(object: SectionFormItem) {
+		let footerBlock: TableViewSectionPart.CreateBlock = {
+			return TableViewSectionPart.None
+		}
+		closeSection(footerBlock)
+	}
+	
+	
+	// MARK: SectionHeaderTitleFormItem
+	
+	func visit(object: SectionHeaderTitleFormItem) {
+		if cells.count > 0 || self.headerBlock != nil {
+			let footerBlock: TableViewSectionPart.CreateBlock = {
+				return TableViewSectionPart.None
+			}
+			closeSection(footerBlock)
+		}
+
+		self.headerBlock = {
+			var item = TableViewSectionPart.None
+			if let title = object.title {
+				item = TableViewSectionPart.TitleString(string: title)
+			}
+			return item
+		}
+	}
+	
+	
+	// MARK: SectionHeaderViewFormItem
+	
+	func visit(object: SectionHeaderViewFormItem) {
+		if cells.count > 0 || self.headerBlock != nil {
+			let footerBlock: TableViewSectionPart.CreateBlock = {
+				return TableViewSectionPart.None
+			}
+			closeSection(footerBlock)
+		}
+
+		self.headerBlock = {
+			let view: UIView? = object.viewBlock?()
+			var item = TableViewSectionPart.None
+			if let view = view {
+				item = TableViewSectionPart.TitleView(view: view)
+			}
+			return item
+		}
+	}
+	
+	
+	// MARK: SegmentedControlFormItem
+	
 	func visit(object: SegmentedControlFormItem) {
 		var model = SegmentedControlCellModel()
 		model.title = object.title

		cells.append(cell)
	}
	
	func visit(object: SwitchFormItem) {
		var model = SwitchCellModel()
		model.title = object.title
		
		weak var weakObject = object
		model.valueDidChange = { (value: Bool) in
			SwiftyFormLog("value did change \(value)")
			weakObject?.switchDidChange(value)
			return
		}

		let cell = SwitchCell(model: model)
		cells.append(cell)

		SwiftyFormLog("will assign value \(object.value)")
		cell.setValueWithoutSync(object.value, animated: false)
		SwiftyFormLog("did assign value \(object.value)")

		weak var weakCell = cell
		object.syncCellWithValue = { (value: Bool, animated: Bool) in
			SwiftyFormLog("sync value \(value)")
			weakCell?.setValueWithoutSync(value, animated: animated)
			return
		}
	}
	
	func visit(object: StepperFormItem) {
		var model = StepperCellModel()
		model.title = object.title
		model.value = object.value

		weak var weakObject = object
		model.valueDidChange = { (value: Int) in
			SwiftyFormLog("value \(value)")
			weakObject?.innerValue = value
			return
		}

		let cell = StepperCell(model: model)
		cells.append(cell)

		SwiftyFormLog("will assign value \(object.value)")
		cell.setValueWithoutSync(object.value, animated: true)
		SwiftyFormLog("did assign value \(object.value)")

		weak var weakCell = cell
		object.syncCellWithValue = { (value: Int, animated: Bool) in
			SwiftyFormLog("sync value \(value)")
			weakCell?.setValueWithoutSync(value, animated: animated)
			return
		}
	}

	func visit(object: SliderFormItem) {
		var model = SliderCellModel()
		model.minimumValue = object.minimumValue
		model.maximumValue = object.maximumValue
		model.value = object.value

		
		weak var weakObject = object
		model.valueDidChange = { (value: Float) in
			SwiftyFormLog("value did change \(value)")
			weakObject?.sliderDidChange(value)
			return
		}

		let cell = SliderCell(model: model)
		cells.append(cell)

		weak var weakCell = cell
		object.syncCellWithValue = { (value: Float, animated: Bool) in
			SwiftyFormLog("sync value \(value)")
			weakCell?.setValueWithoutSync(value, animated: animated)
			return
		}
	}
	
	func visit(object: PrecisionSliderFormItem) {
		let model = PrecisionSliderCellModel()

		}
	}
	
	
	// MARK: MetaFormItem
	
	func visit(object: MetaFormItem) {
		// this item is not visual
	}
	
	
	// MARK: OptionPickerFormItem
	
	func visit(object: OptionPickerFormItem) {
		var model = OptionViewControllerCellModel()
		model.title = object.title
		model.placeholder = object.placeholder
		model.optionField = object
		model.selectedOptionRow = object.selected

		weak var weakObject = object
		model.valueDidChange = { (value: OptionRowModel?) in
			SwiftyFormLog("propagate from cell to model. value \(value)")
			weakObject?.innerSelected = value
			weakObject?.valueDidChange(selected: value)
		}
		
		let cell = OptionViewControllerCell(
			parentViewController: self.model.viewController,
			model: model
		)
		cells.append(cell)
		
		weak var weakCell = cell
		object.syncCellWithValue = { (selected: OptionRowModel?) in
			SwiftyFormLog("propagate from model to cell. option: \(selected?.title)")
			weakCell?.setSelectedOptionRowWithoutPropagation(selected)
		}
	}
	
	
	// MARK: OptionRowFormItem
	
	func visit(object: OptionRowFormItem) {
		weak var weakViewController = self.model.viewController
		let cell = OptionCell(model: object) {
