             self.layer.addSublayer(layer)
         }
     }
-}
-
-// This is a hack because subclasses of MultiInputOutputConstraintView must also be generic, but can use a throwaway generic apparently
-typealias MultiplierView = MultiplierViewGeneric<AnyObject>
-class MultiplierViewGeneric<T>: MultiInputOutputConstraintView<Multiplier> {
+    
+    override init(coder aDecoder: NSCoder) {
+        fatalError("Initializer not supported")
+    }
+}
+
+class MultiplierView: MultiInputOutputConstraintView {
+    let multiplier: Multiplier
     init(multiplier: Multiplier) {
+        self.multiplier = multiplier
         super.init(constraint: multiplier)
     }
     

    }
}

typealias AdderView = AdderViewGeneric<AnyObject>
class AdderViewGeneric<T>: MultiInputOutputConstraintView<Adder> {
    init(adder: Adder) {
        super.init(constraint: adder)
    }
    

        }
    }
    
    let redLayer: CALayer = CALayer()
    let blueLayer: CALayer = CALayer()
    let purpleLayer: CALayer = CALayer()
    init(constraint: MultiInputOutputConstraint) {
        self.constraint = constraint
        super.init(frame: CGRectZero)
        self.layer.cornerRadius = 5
        addSentinelConnectorToPort(self.redInput)
        addSentinelConnectorToPort(self.blueInput)
