//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use crate::common::*;
use crate::CoreAnimation::*;
use crate::Foundation::*;

typed_enum!(
    pub type CAAnimationCalculationMode = NSString;
);

typed_enum!(
    pub type CAAnimationRotationMode = NSString;
);

typed_enum!(
    pub type CATransitionType = NSString;
);

typed_enum!(
    pub type CATransitionSubtype = NSString;
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CAAnimation")]
    pub struct CAAnimation;

    #[cfg(feature = "CoreAnimation_CAAnimation")]
    unsafe impl ClassType for CAAnimation {
        type Super = NSObject;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CAAnimation")]
unsafe impl CAAction for CAAnimation {}

#[cfg(feature = "CoreAnimation_CAAnimation")]
unsafe impl CAMediaTiming for CAAnimation {}

#[cfg(feature = "CoreAnimation_CAAnimation")]
unsafe impl NSCoding for CAAnimation {}

#[cfg(feature = "CoreAnimation_CAAnimation")]
unsafe impl NSCopying for CAAnimation {}

#[cfg(feature = "CoreAnimation_CAAnimation")]
unsafe impl NSObjectProtocol for CAAnimation {}

#[cfg(feature = "CoreAnimation_CAAnimation")]
unsafe impl NSSecureCoding for CAAnimation {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CAAnimation")]
    unsafe impl CAAnimation {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;

        #[cfg(feature = "Foundation_NSString")]
        #[method_id(@__retain_semantics Other defaultValueForKey:)]
        pub unsafe fn defaultValueForKey(key: &NSString) -> Option<Id<AnyObject>>;

        #[cfg(feature = "Foundation_NSString")]
        #[method(shouldArchiveValueForKey:)]
        pub unsafe fn shouldArchiveValueForKey(&self, key: &NSString) -> bool;

        #[cfg(feature = "CoreAnimation_CAMediaTimingFunction")]
        #[method_id(@__retain_semantics Other timingFunction)]
        pub unsafe fn timingFunction(&self) -> Option<Id<CAMediaTimingFunction>>;

        #[cfg(feature = "CoreAnimation_CAMediaTimingFunction")]
        #[method(setTimingFunction:)]
        pub unsafe fn setTimingFunction(&self, timing_function: Option<&CAMediaTimingFunction>);

        #[method_id(@__retain_semantics Other delegate)]
        pub unsafe fn delegate(&self) -> Option<Id<ProtocolObject<dyn CAAnimationDelegate>>>;

        #[method(setDelegate:)]
        pub unsafe fn setDelegate(
            &self,
            delegate: Option<&ProtocolObject<dyn CAAnimationDelegate>>,
        );

        #[method(isRemovedOnCompletion)]
        pub unsafe fn isRemovedOnCompletion(&self) -> bool;

        #[method(setRemovedOnCompletion:)]
        pub unsafe fn setRemovedOnCompletion(&self, removed_on_completion: bool);

        #[method(preferredFrameRateRange)]
        pub unsafe fn preferredFrameRateRange(&self) -> CAFrameRateRange;

        #[method(setPreferredFrameRateRange:)]
        pub unsafe fn setPreferredFrameRateRange(
            &self,
            preferred_frame_rate_range: CAFrameRateRange,
        );
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CAAnimation")]
    unsafe impl CAAnimation {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_protocol!(
    pub unsafe trait CAAnimationDelegate: NSObjectProtocol {
        #[cfg(feature = "CoreAnimation_CAAnimation")]
        #[optional]
        #[method(animationDidStart:)]
        unsafe fn animationDidStart(&self, anim: &CAAnimation);

        #[cfg(feature = "CoreAnimation_CAAnimation")]
        #[optional]
        #[method(animationDidStop:finished:)]
        unsafe fn animationDidStop_finished(&self, anim: &CAAnimation, flag: bool);
    }

    unsafe impl ProtocolType for dyn CAAnimationDelegate {}
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
    pub struct CAPropertyAnimation;

    #[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
    unsafe impl ClassType for CAPropertyAnimation {
        #[inherits(NSObject)]
        type Super = CAAnimation;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
unsafe impl CAAction for CAPropertyAnimation {}

#[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
unsafe impl CAMediaTiming for CAPropertyAnimation {}

#[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
unsafe impl NSCoding for CAPropertyAnimation {}

#[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
unsafe impl NSCopying for CAPropertyAnimation {}

#[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
unsafe impl NSObjectProtocol for CAPropertyAnimation {}

#[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
unsafe impl NSSecureCoding for CAPropertyAnimation {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
    unsafe impl CAPropertyAnimation {
        #[cfg(feature = "Foundation_NSString")]
        #[method_id(@__retain_semantics Other animationWithKeyPath:)]
        pub unsafe fn animationWithKeyPath(path: Option<&NSString>) -> Id<Self>;

        #[cfg(feature = "Foundation_NSString")]
        #[method_id(@__retain_semantics Other keyPath)]
        pub unsafe fn keyPath(&self) -> Option<Id<NSString>>;

        #[cfg(feature = "Foundation_NSString")]
        #[method(setKeyPath:)]
        pub unsafe fn setKeyPath(&self, key_path: Option<&NSString>);

        #[method(isAdditive)]
        pub unsafe fn isAdditive(&self) -> bool;

        #[method(setAdditive:)]
        pub unsafe fn setAdditive(&self, additive: bool);

        #[method(isCumulative)]
        pub unsafe fn isCumulative(&self) -> bool;

        #[method(setCumulative:)]
        pub unsafe fn setCumulative(&self, cumulative: bool);

        #[cfg(feature = "CoreAnimation_CAValueFunction")]
        #[method_id(@__retain_semantics Other valueFunction)]
        pub unsafe fn valueFunction(&self) -> Option<Id<CAValueFunction>>;

        #[cfg(feature = "CoreAnimation_CAValueFunction")]
        #[method(setValueFunction:)]
        pub unsafe fn setValueFunction(&self, value_function: Option<&CAValueFunction>);
    }
);

extern_methods!(
    /// Methods declared on superclass `CAAnimation`
    #[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
    unsafe impl CAPropertyAnimation {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CAPropertyAnimation")]
    unsafe impl CAPropertyAnimation {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CABasicAnimation")]
    pub struct CABasicAnimation;

    #[cfg(feature = "CoreAnimation_CABasicAnimation")]
    unsafe impl ClassType for CABasicAnimation {
        #[inherits(CAAnimation, NSObject)]
        type Super = CAPropertyAnimation;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CABasicAnimation")]
unsafe impl CAAction for CABasicAnimation {}

#[cfg(feature = "CoreAnimation_CABasicAnimation")]
unsafe impl CAMediaTiming for CABasicAnimation {}

#[cfg(feature = "CoreAnimation_CABasicAnimation")]
unsafe impl NSCoding for CABasicAnimation {}

#[cfg(feature = "CoreAnimation_CABasicAnimation")]
unsafe impl NSCopying for CABasicAnimation {}

#[cfg(feature = "CoreAnimation_CABasicAnimation")]
unsafe impl NSObjectProtocol for CABasicAnimation {}

#[cfg(feature = "CoreAnimation_CABasicAnimation")]
unsafe impl NSSecureCoding for CABasicAnimation {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CABasicAnimation")]
    unsafe impl CABasicAnimation {
        #[method_id(@__retain_semantics Other fromValue)]
        pub unsafe fn fromValue(&self) -> Option<Id<AnyObject>>;

        #[method(setFromValue:)]
        pub unsafe fn setFromValue(&self, from_value: Option<&AnyObject>);

        #[method_id(@__retain_semantics Other toValue)]
        pub unsafe fn toValue(&self) -> Option<Id<AnyObject>>;

        #[method(setToValue:)]
        pub unsafe fn setToValue(&self, to_value: Option<&AnyObject>);

        #[method_id(@__retain_semantics Other byValue)]
        pub unsafe fn byValue(&self) -> Option<Id<AnyObject>>;

        #[method(setByValue:)]
        pub unsafe fn setByValue(&self, by_value: Option<&AnyObject>);
    }
);

extern_methods!(
    /// Methods declared on superclass `CAPropertyAnimation`
    #[cfg(feature = "CoreAnimation_CABasicAnimation")]
    unsafe impl CABasicAnimation {
        #[cfg(feature = "Foundation_NSString")]
        #[method_id(@__retain_semantics Other animationWithKeyPath:)]
        pub unsafe fn animationWithKeyPath(path: Option<&NSString>) -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `CAAnimation`
    #[cfg(feature = "CoreAnimation_CABasicAnimation")]
    unsafe impl CABasicAnimation {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CABasicAnimation")]
    unsafe impl CABasicAnimation {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
    pub struct CAKeyframeAnimation;

    #[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
    unsafe impl ClassType for CAKeyframeAnimation {
        #[inherits(CAAnimation, NSObject)]
        type Super = CAPropertyAnimation;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
unsafe impl CAAction for CAKeyframeAnimation {}

#[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
unsafe impl CAMediaTiming for CAKeyframeAnimation {}

#[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
unsafe impl NSCoding for CAKeyframeAnimation {}

#[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
unsafe impl NSCopying for CAKeyframeAnimation {}

#[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
unsafe impl NSObjectProtocol for CAKeyframeAnimation {}

#[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
unsafe impl NSSecureCoding for CAKeyframeAnimation {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
    unsafe impl CAKeyframeAnimation {
        #[cfg(feature = "Foundation_NSArray")]
        #[method_id(@__retain_semantics Other values)]
        pub unsafe fn values(&self) -> Option<Id<NSArray>>;

        #[cfg(feature = "Foundation_NSArray")]
        #[method(setValues:)]
        pub unsafe fn setValues(&self, values: Option<&NSArray>);

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method_id(@__retain_semantics Other keyTimes)]
        pub unsafe fn keyTimes(&self) -> Option<Id<NSArray<NSNumber>>>;

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method(setKeyTimes:)]
        pub unsafe fn setKeyTimes(&self, key_times: Option<&NSArray<NSNumber>>);

        #[cfg(all(
            feature = "CoreAnimation_CAMediaTimingFunction",
            feature = "Foundation_NSArray"
        ))]
        #[method_id(@__retain_semantics Other timingFunctions)]
        pub unsafe fn timingFunctions(&self) -> Option<Id<NSArray<CAMediaTimingFunction>>>;

        #[cfg(all(
            feature = "CoreAnimation_CAMediaTimingFunction",
            feature = "Foundation_NSArray"
        ))]
        #[method(setTimingFunctions:)]
        pub unsafe fn setTimingFunctions(
            &self,
            timing_functions: Option<&NSArray<CAMediaTimingFunction>>,
        );

        #[method_id(@__retain_semantics Other calculationMode)]
        pub unsafe fn calculationMode(&self) -> Id<CAAnimationCalculationMode>;

        #[method(setCalculationMode:)]
        pub unsafe fn setCalculationMode(&self, calculation_mode: &CAAnimationCalculationMode);

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method_id(@__retain_semantics Other tensionValues)]
        pub unsafe fn tensionValues(&self) -> Option<Id<NSArray<NSNumber>>>;

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method(setTensionValues:)]
        pub unsafe fn setTensionValues(&self, tension_values: Option<&NSArray<NSNumber>>);

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method_id(@__retain_semantics Other continuityValues)]
        pub unsafe fn continuityValues(&self) -> Option<Id<NSArray<NSNumber>>>;

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method(setContinuityValues:)]
        pub unsafe fn setContinuityValues(&self, continuity_values: Option<&NSArray<NSNumber>>);

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method_id(@__retain_semantics Other biasValues)]
        pub unsafe fn biasValues(&self) -> Option<Id<NSArray<NSNumber>>>;

        #[cfg(all(feature = "Foundation_NSArray", feature = "Foundation_NSNumber"))]
        #[method(setBiasValues:)]
        pub unsafe fn setBiasValues(&self, bias_values: Option<&NSArray<NSNumber>>);

        #[method_id(@__retain_semantics Other rotationMode)]
        pub unsafe fn rotationMode(&self) -> Option<Id<CAAnimationRotationMode>>;

        #[method(setRotationMode:)]
        pub unsafe fn setRotationMode(&self, rotation_mode: Option<&CAAnimationRotationMode>);
    }
);

extern_methods!(
    /// Methods declared on superclass `CAPropertyAnimation`
    #[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
    unsafe impl CAKeyframeAnimation {
        #[cfg(feature = "Foundation_NSString")]
        #[method_id(@__retain_semantics Other animationWithKeyPath:)]
        pub unsafe fn animationWithKeyPath(path: Option<&NSString>) -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `CAAnimation`
    #[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
    unsafe impl CAKeyframeAnimation {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CAKeyframeAnimation")]
    unsafe impl CAKeyframeAnimation {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_static!(kCAAnimationLinear: &'static CAAnimationCalculationMode);

extern_static!(kCAAnimationDiscrete: &'static CAAnimationCalculationMode);

extern_static!(kCAAnimationPaced: &'static CAAnimationCalculationMode);

extern_static!(kCAAnimationCubic: &'static CAAnimationCalculationMode);

extern_static!(kCAAnimationCubicPaced: &'static CAAnimationCalculationMode);

extern_static!(kCAAnimationRotateAuto: &'static CAAnimationRotationMode);

extern_static!(kCAAnimationRotateAutoReverse: &'static CAAnimationRotationMode);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CASpringAnimation")]
    pub struct CASpringAnimation;

    #[cfg(feature = "CoreAnimation_CASpringAnimation")]
    unsafe impl ClassType for CASpringAnimation {
        #[inherits(CAPropertyAnimation, CAAnimation, NSObject)]
        type Super = CABasicAnimation;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CASpringAnimation")]
unsafe impl CAAction for CASpringAnimation {}

#[cfg(feature = "CoreAnimation_CASpringAnimation")]
unsafe impl CAMediaTiming for CASpringAnimation {}

#[cfg(feature = "CoreAnimation_CASpringAnimation")]
unsafe impl NSCoding for CASpringAnimation {}

#[cfg(feature = "CoreAnimation_CASpringAnimation")]
unsafe impl NSCopying for CASpringAnimation {}

#[cfg(feature = "CoreAnimation_CASpringAnimation")]
unsafe impl NSObjectProtocol for CASpringAnimation {}

#[cfg(feature = "CoreAnimation_CASpringAnimation")]
unsafe impl NSSecureCoding for CASpringAnimation {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CASpringAnimation")]
    unsafe impl CASpringAnimation {
        #[method(mass)]
        pub unsafe fn mass(&self) -> CGFloat;

        #[method(setMass:)]
        pub unsafe fn setMass(&self, mass: CGFloat);

        #[method(stiffness)]
        pub unsafe fn stiffness(&self) -> CGFloat;

        #[method(setStiffness:)]
        pub unsafe fn setStiffness(&self, stiffness: CGFloat);

        #[method(damping)]
        pub unsafe fn damping(&self) -> CGFloat;

        #[method(setDamping:)]
        pub unsafe fn setDamping(&self, damping: CGFloat);

        #[method(initialVelocity)]
        pub unsafe fn initialVelocity(&self) -> CGFloat;

        #[method(setInitialVelocity:)]
        pub unsafe fn setInitialVelocity(&self, initial_velocity: CGFloat);

        #[method(settlingDuration)]
        pub unsafe fn settlingDuration(&self) -> CFTimeInterval;
    }
);

extern_methods!(
    /// Methods declared on superclass `CAPropertyAnimation`
    #[cfg(feature = "CoreAnimation_CASpringAnimation")]
    unsafe impl CASpringAnimation {
        #[cfg(feature = "Foundation_NSString")]
        #[method_id(@__retain_semantics Other animationWithKeyPath:)]
        pub unsafe fn animationWithKeyPath(path: Option<&NSString>) -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `CAAnimation`
    #[cfg(feature = "CoreAnimation_CASpringAnimation")]
    unsafe impl CASpringAnimation {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CASpringAnimation")]
    unsafe impl CASpringAnimation {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CATransition")]
    pub struct CATransition;

    #[cfg(feature = "CoreAnimation_CATransition")]
    unsafe impl ClassType for CATransition {
        #[inherits(NSObject)]
        type Super = CAAnimation;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CATransition")]
unsafe impl CAAction for CATransition {}

#[cfg(feature = "CoreAnimation_CATransition")]
unsafe impl CAMediaTiming for CATransition {}

#[cfg(feature = "CoreAnimation_CATransition")]
unsafe impl NSCoding for CATransition {}

#[cfg(feature = "CoreAnimation_CATransition")]
unsafe impl NSCopying for CATransition {}

#[cfg(feature = "CoreAnimation_CATransition")]
unsafe impl NSObjectProtocol for CATransition {}

#[cfg(feature = "CoreAnimation_CATransition")]
unsafe impl NSSecureCoding for CATransition {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CATransition")]
    unsafe impl CATransition {
        #[method_id(@__retain_semantics Other type)]
        pub unsafe fn r#type(&self) -> Id<CATransitionType>;

        #[method(setType:)]
        pub unsafe fn setType(&self, r#type: &CATransitionType);

        #[method_id(@__retain_semantics Other subtype)]
        pub unsafe fn subtype(&self) -> Option<Id<CATransitionSubtype>>;

        #[method(setSubtype:)]
        pub unsafe fn setSubtype(&self, subtype: Option<&CATransitionSubtype>);

        #[method(startProgress)]
        pub unsafe fn startProgress(&self) -> c_float;

        #[method(setStartProgress:)]
        pub unsafe fn setStartProgress(&self, start_progress: c_float);

        #[method(endProgress)]
        pub unsafe fn endProgress(&self) -> c_float;

        #[method(setEndProgress:)]
        pub unsafe fn setEndProgress(&self, end_progress: c_float);

        #[method_id(@__retain_semantics Other filter)]
        pub unsafe fn filter(&self) -> Option<Id<AnyObject>>;

        #[method(setFilter:)]
        pub unsafe fn setFilter(&self, filter: Option<&AnyObject>);
    }
);

extern_methods!(
    /// Methods declared on superclass `CAAnimation`
    #[cfg(feature = "CoreAnimation_CATransition")]
    unsafe impl CATransition {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CATransition")]
    unsafe impl CATransition {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);

extern_static!(kCATransitionFade: &'static CATransitionType);

extern_static!(kCATransitionMoveIn: &'static CATransitionType);

extern_static!(kCATransitionPush: &'static CATransitionType);

extern_static!(kCATransitionReveal: &'static CATransitionType);

extern_static!(kCATransitionFromRight: &'static CATransitionSubtype);

extern_static!(kCATransitionFromLeft: &'static CATransitionSubtype);

extern_static!(kCATransitionFromTop: &'static CATransitionSubtype);

extern_static!(kCATransitionFromBottom: &'static CATransitionSubtype);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "CoreAnimation_CAAnimationGroup")]
    pub struct CAAnimationGroup;

    #[cfg(feature = "CoreAnimation_CAAnimationGroup")]
    unsafe impl ClassType for CAAnimationGroup {
        #[inherits(NSObject)]
        type Super = CAAnimation;
        type Mutability = InteriorMutable;
    }
);

#[cfg(feature = "CoreAnimation_CAAnimationGroup")]
unsafe impl CAAction for CAAnimationGroup {}

#[cfg(feature = "CoreAnimation_CAAnimationGroup")]
unsafe impl CAMediaTiming for CAAnimationGroup {}

#[cfg(feature = "CoreAnimation_CAAnimationGroup")]
unsafe impl NSCoding for CAAnimationGroup {}

#[cfg(feature = "CoreAnimation_CAAnimationGroup")]
unsafe impl NSCopying for CAAnimationGroup {}

#[cfg(feature = "CoreAnimation_CAAnimationGroup")]
unsafe impl NSObjectProtocol for CAAnimationGroup {}

#[cfg(feature = "CoreAnimation_CAAnimationGroup")]
unsafe impl NSSecureCoding for CAAnimationGroup {}

extern_methods!(
    #[cfg(feature = "CoreAnimation_CAAnimationGroup")]
    unsafe impl CAAnimationGroup {
        #[cfg(feature = "Foundation_NSArray")]
        #[method_id(@__retain_semantics Other animations)]
        pub unsafe fn animations(&self) -> Option<Id<NSArray<CAAnimation>>>;

        #[cfg(feature = "Foundation_NSArray")]
        #[method(setAnimations:)]
        pub unsafe fn setAnimations(&self, animations: Option<&NSArray<CAAnimation>>);
    }
);

extern_methods!(
    /// Methods declared on superclass `CAAnimation`
    #[cfg(feature = "CoreAnimation_CAAnimationGroup")]
    unsafe impl CAAnimationGroup {
        #[method_id(@__retain_semantics Other animation)]
        pub unsafe fn animation() -> Id<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "CoreAnimation_CAAnimationGroup")]
    unsafe impl CAAnimationGroup {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Option<Allocated<Self>>) -> Id<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new() -> Id<Self>;
    }
);
