         propertyExtractor.setAsyncLoader  (nil)
         propertyExtractor.clear()
     }
-    
+
     private func cancelBlock(propertyExtractor: PropertyExtractorType, callbacks: CallbacksBlocksHolder<Value, Error>) -> AsyncHandler {
-        
+
         return { (task: AsyncHandlerTask) -> () in
-            
+
             if propertyExtractor.cleared {
                 return
             }
-            
+
             let handlerOption = propertyExtractor.getLoaderHandler()
-            
+
             guard let handler = handlerOption else { return }
 
             switch task {

            }
        }
    }
    
    private func performNativeLoader(
        propertyExtractor: PropertyExtractorType,
        callbacks: CallbacksBlocksHolder<Value, Error>) -> AsyncHandler
    {
        func progressCallback(progressInfo: AnyObject) {
            
            propertyExtractor.eachDelegate({(delegate: CallbacksBlocksHolder<Value, Error>) -> () in
                delegate.progressCallback?(progressInfo: progressInfo)
                return
            })
        }
        
        let doneCallback = doneCallbackBlock(propertyExtractor)
        
        func stateCallback(state: AsyncState) {
            
            propertyExtractor.eachDelegate({(delegate: CallbacksBlocksHolder<Value, Error>) -> () in
                delegate.stateCallback?(state: state)
                return
            })
        }

        let loader  = propertyExtractor.getAsyncLoader()

        //so set loader again
        setAsyncLoader(loader)
    }

    //private def getObjectRelatedPropertyData: ObjectRelatedPropertyData[ValueT] = {
    func getObjectRelatedPropertyData() -> ObjectRelatedPropertyData<ValueT, ErrorT> {

        let resultOption = cacheObject!.delegatesByKey[uniqueKey]

        if let result = resultOption {
            return result
        }

        let result = ObjectRelatedPropertyData<ValueT, ErrorT>()
        cacheObject!.delegatesByKey[uniqueKey] = result
        return result
    }

    func copyDelegates() -> [CallbacksBlocksHolder<ValueT, ErrorT>] {
        return getObjectRelatedPropertyData().copyDelegates()
    }

    func eachDelegate(block: (obj: CallbacksBlocksHolder<ValueT, ErrorT>) -> ()) {
        return getObjectRelatedPropertyData().eachDelegate(block)
    }

    func hasDelegates() -> Bool {
        return getObjectRelatedPropertyData().hasDelegates()
    }

    func clearDelegates() {
        getObjectRelatedPropertyData().clearDelegates()
    }

    //func getDelegates: mutable.ArrayBuffer[CallbacksBlocksHolder[ValueT]] = {
    func addDelegate(delegate: CallbacksBlocksHolder<ValueT, ErrorT>) {
        getObjectRelatedPropertyData().addDelegate(delegate)
    }

    func removeDelegate(delegate: CallbacksBlocksHolder<ValueT, ErrorT>) {
        getObjectRelatedPropertyData().removeDelegate(delegate)
    }

    func getLoaderHandler() -> AsyncHandler? {
        return getObjectRelatedPropertyData().loaderHandler
    }

    func setLoaderHandler(handler: AsyncHandler?) {
        getObjectRelatedPropertyData().loaderHandler = handler
    }

    //def getAsyncLoader: Async[ValueT] =
    func getAsyncLoader() -> AsyncTypes<ValueT, ErrorT>.Async? {
        return getObjectRelatedPropertyData().asyncLoader
    }

    //def setAsyncLoader(loader: Async[ValueT])
    func setAsyncLoader(loader: AsyncTypes<ValueT, ErrorT>.Async?) {
        getObjectRelatedPropertyData().asyncLoader = loader
    }

    func getAsyncResult() -> AsyncResult<ValueT, ErrorT>? {
        return getterOption?()
    }

    func clear() {

        if cleared { return }

        cacheObject!.delegatesByKey.removeValueForKey(uniqueKey)

        setterOption = nil
        getterOption = nil
        cacheObject  = nil

        cleared = true
    }
}
