         }
     }
     
-    fileprivate func updateShadowColor() {
+    private func updateShadowColor() {
         if let stateChange = shadowColors[state.rawValue] ?? shadowColors[UIControl.State.normal.rawValue], layer.shadowColor == nil || UIColor(cgColor: layer.shadowColor!) != UIColor(cgColor: stateChange.value) {
             if stateChange.animated, !lockAnimatedUpdate {
                 animate(layer: layer, from: sourceLayer.shadowColor, to: stateChange.value, forKey: "shadowColor", duration: stateChange.animationDuration)

        setup()
    }
    
    fileprivate func setup() {
        lockAnimatedUpdate = true
        configureButtonStyles()
        update()

    }
    
    /// used to lock any animated state transition for initial setup
    private var lockAnimatedUpdate: Bool = true
    
    /// used to determine the `from` value of any animation
    private var sourceLayer: CALayer {
        return (layer.presentation() ?? layer)
    }
    
    // MARK: State values with initial values
    
    private lazy var backgroundColors: [ControlState: SimpleButtonStateChangeValue<CGColor>] = {
        if let color = self.backgroundColor?.cgColor {
            return [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: color, animated: true, animationDuration: self.defaultAnimationDuration)]
        }
        return [:]
    }()
    
    private lazy var borderColors: [ControlState: SimpleButtonStateChangeValue<CGColor>] = {
        if let color = self.layer.borderColor {
            return [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: color, animated: true, animationDuration: self.defaultAnimationDuration)]
        }
        return [:]
    }()
    
    private lazy var buttonScales: [ControlState: SimpleButtonStateChangeValue<CGFloat>] = {
        [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: 1.0, animated: true, animationDuration: self.defaultAnimationDuration)]
    }()
    
    private lazy var borderWidths: [ControlState: SimpleButtonStateChangeValue<CGFloat>] = {
        [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: self.layer.borderWidth, animated: true, animationDuration: self.defaultAnimationDuration)]
    }()
    
    private lazy var cornerRadii: [ControlState: SimpleButtonStateChangeValue<CGFloat>] = {
        [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: self.layer.cornerRadius, animated: true, animationDuration: self.defaultAnimationDuration)]
    }()
    
    private lazy var shadowColors: [ControlState: SimpleButtonStateChangeValue<CGColor>] = {
        if let color = self.layer.shadowColor {
            return [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: color, animated: true, animationDuration: self.defaultAnimationDuration)]
        }
        return [:]
    }()
    
    private lazy var shadowOpacities: [ControlState: SimpleButtonStateChangeValue<Float>] = {
        [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: self.layer.shadowOpacity, animated: true, animationDuration: self.defaultAnimationDuration)]
    }()
    
    private lazy var shadowOffsets: [ControlState: SimpleButtonStateChangeValue<CGSize>] = {
        [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: self.layer.shadowOffset, animated: true, animationDuration: self.defaultAnimationDuration)]
    }()
    
    private lazy var shadowRadii: [ControlState: SimpleButtonStateChangeValue<CGFloat>] = {
        [UIControl.State.normal.rawValue: SimpleButtonStateChangeValue(value: self.layer.shadowRadius, animated: true, animationDuration: self.defaultAnimationDuration)]
    }()
    
