     /// refresh self and children theme
     ///
     /// - Parameter data: ata: data used to switch theme, will pass to refreshBlock(data:pre:) as first argument
-    public func refresh<T>(with data:T) {
-        conf.passConf = true
-        conf.recursion = true
-        conf.dataSelf = true
-        workerWrapper(data: ThemeSwitchData.init(data: data))
+    ///   - option: theme switch option
+    public func refresh<T>(with data:T, option:ThemeSwitchOptions = [.self, .children, .forceRefresh]) {
+        workerWrapper(data: ThemeSwitchData.init(data: data), option: option)
     }
     
     /// refresh self and children theme
     ///
     /// - Parameter refresh: true force refresh, false will use current theme
     public func refresh(refresh:Bool = true) {
-        conf.passConf = true
-        conf.recursion = true
         if let data = self.data {
             if refresh {
-                workerWrapper(data: data.copyWithExtData())
+                workerWrapper(data: data, option: [.self, .children, .forceRefresh])
             } else {
-                workerWrapper(data: data)
+                workerWrapper(data: data, option: .default)
             }
         } else {
-            workerWrapper(data: ThemeSwitchDataCenter.shared.switchData)
-        }
-    }
-    
-    /**
-     this method should use internal for auto init
-     */
-    func refreshSelfInit() {
-        conf.passConf = true
-        conf.recursion = true
-        workerWrapper(data: ThemeSwitchDataCenter.shared.switchData)
-    }
-    
-    /**
-     this method should use internal for auto switch config (for circleCall method)
-     */
-    func refreshSelfOnly() {
-        conf.passConf = false
-        conf.recursion = false
-        if let data = self.data , conf.dataSelf {
-            workerWrapper(data: data)
-        } else {
-            workerWrapper(data: ThemeSwitchDataCenter.shared.switchData)
+            workerWrapper(data: ThemeSwitchDataCenter.shared.switchData, option: [.self, .children, .forceRefresh])
         }
     }
 }

 - returns: true switch theme will happen, or false ignore switch theme
 */
public typealias SwitchThemeBlock = ((_ now: Any, _ pre: Any?) -> Void)
open class CHObjectWrapper<T> {
    var value :T?
    init(value:T?) {

    /// internal data used theme switch
    var data:ThemeSwitchData? {get set}
    
    /// switch block
    var refreshBlock:SwitchThemeBlock? {get set}
    
