     }
 
 }
-
-private final class FuncBox<T: Theme> {
-
-    typealias ThemingFn = (_ theme: T) -> Void
-
-    let apply: ThemingFn
-
-    init(_ fn: @escaping ThemingFn) {
-        self.apply = fn
-    }
-}
-
-public protocol Themeable: class {
-
-    associatedtype ThemeType: Theme
-
-    func apply(theme: ThemeType)
-
-}
-
-public protocol Theme: Equatable {
-
-    var identifier: String { get }
-    static var variants: [Self] { get }
-
-    static func ==(lhs: Self, rhs: Self) -> Bool
-
-}
-
-public extension Theme {
-
-    static func ==(lhs: Self, rhs: Self) -> Bool {
-        return lhs.identifier == rhs.identifier
-    }
-
-}

        self.theme = themeWithId ?? theme
    }

}




internal let ThemeNotification = Notification.Name("ThemeableDidSetTheme")
private let CurrentThemeIdentifier = "ThemeableCurrentThemeIdentifier"


public protocol Theme: Equatable {

    var identifier: String { get }
    static var variants: [Self] { get }

    static func ==(lhs: Self, rhs: Self) -> Bool

}

public extension Theme {

    static func ==(lhs: Self, rhs: Self) -> Bool {
        return lhs.identifier == rhs.identifier
    }

}


public final class ThemeManager<T: Theme> {

