     
     public func makeCellReaction<T,U where T: ModelTransfer>(block: (T, T.ModelType, IndexPath) -> U) {
         type = .cell
+        modelTypeCheckingBlock = { return $0 is T.ModelType }
         reaction = { cell, model, indexPath in
             guard let model = model as? T.ModelType,
-                let indexPath = indexPath as? IndexPath else {
-                    return 0
+                let indexPath = indexPath as? IndexPath,
+                let cell = cell as? T
+            else {
+                return 0
             }
-            return block(cell as! T, model, indexPath)
+            return block(cell, model, indexPath)
         }
     }
     
     public func makeSupplementaryReaction<T,U where T: ModelTransfer>(forKind kind: String, block: (T?, T.ModelType, Int) -> U) {
+        modelTypeCheckingBlock = { return $0 is T.ModelType }
         type = .supplementary(kind: kind)
         reaction = { supplementary, model, sectionIndex in
             guard let model = model as? T.ModelType,


public final class EventReaction {
    public var type: EventType = .cell
    public let modelClass: Any.Type
    public var reaction : ((Any,Any,Any) -> Any)?
    public let methodSignature: String
    
    public init(signature: String, modelClass: Any.Type) {
        self.methodSignature = signature
        self.modelClass = modelClass
    }
    
    public func makeCellReaction<T,U where T: ModelTransfer>(block: (T?, T.ModelType, IndexPath) -> U) {
        type = .cell
        reaction = { cell, model, indexPath in
            guard let model = model as? T.ModelType,
                let indexPath = indexPath as? IndexPath else {

    }
    
    public func makeSupplementaryReaction<T,U where T: ModelTransfer>(forKind kind: String, block: (T, T.ModelType, Int) -> U) {
        modelTypeCheckingBlock = { return $0 is T.ModelType }
        type = .supplementary(kind: kind)
        reaction = { supplementary, model, sectionIndex in
            guard let model = model as? T.ModelType,
                let index = sectionIndex as? Int,
                let supplementary = supplementary as? T else
            {
                    return ""
            }
            return block(supplementary, model, index)
        }
    }
    
