         }
     }}
     
-    override public func layoutIfNeeded() {
+    override open func layoutIfNeeded() {
         super.layoutIfNeeded()
         self.bringSubview(toFront: overlay)
     }
     
-    override public func addSubview(_ view: UIView) {
+    override open func addSubview(_ view: UIView) {
         if let overlay = overlay {
             insertSubview(view, belowSubview: overlay)
         } else {

        }
    }
    
    override public var contentVerticalAlignment: UIControlContentVerticalAlignment { didSet {
        self.nestedButtons.forEach { $0.contentVerticalAlignment = contentVerticalAlignment }
    }}
    
    override public var contentHorizontalAlignment: UIControlContentHorizontalAlignment{ didSet {
        self.nestedButtons.forEach { $0.contentHorizontalAlignment = contentHorizontalAlignment }
    }}
    
    
    override public func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
        self.nestedButtons.forEach { $0.beginTracking(touch, with: event) }
        return super.beginTracking(touch, with: event)
    }

    override public func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
        self.nestedButtons.forEach { $0.continueTracking(touch, with: event) }
        return super.continueTracking(touch, with: event)
    }

    override public func endTracking(_ touch: UITouch?, with event: UIEvent?) {
        self.nestedButtons.forEach { $0.endTracking(touch, with: event) }
        return super.endTracking(touch, with: event)
    }

    override public func cancelTracking(with event: UIEvent?) {
        self.nestedButtons.forEach { $0.cancelTracking(with: event) }
        super.cancelTracking(with: event)
    }
    
    override public func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControlEvents) {
        overlay.addTarget(target, action: action, for: controlEvents)
    }
    
    override public func removeTarget(_ target: Any?, action: Selector?, for controlEvents: UIControlEvents) {
        overlay.removeTarget(target, action: action, for: controlEvents)
    }
    
    override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        let newValue = change![.newKey] as! Bool
        switch keyPath {
        case "highlighted"?: isHighlighted = newValue


import UIKit

open class ComplexButton: UIControl {
    
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
