 
     /// The network failed to send the request, or failed to retrieve a response (eg a timeout).
     case NetworkError(NSError)
+
+    /// You usually don't need this, It's will raise a fetalError
+    case NoStubError
 }
 
 public struct StubRule {

            completion(response: response, data: data, error: nil)
        case .NetworkError(let error):
            completion(response: nil, data: nil, error: error)
        }
    }
}

public class GenericStubBackend<Target: TargetType>: StubBackend {
    public override init(behavior: StubBehavior = .Immediate) {
        super.init(behavior: behavior)
    }

    public func stub(target: Target, response: StubResponse, withBehavior behavior: StubBehavior? = nil) {
        self.stubTarget(target, response: response, withBehavior: behavior)
    }

    public func stub(target: Target, conditionalResponse: StubRule.ConditionalResponseClosure, withBehavior behavior: StubBehavior? = nil) {
        self.stubTarget(target, conditionalResponse: conditionalResponse, withBehavior: behavior)
    }

    public func removeStub(target: Target) {

    public func request(request: NSURLRequest, target: TargetType, completion: (response: NSHTTPURLResponse?, data: NSData?, error: NSError?) -> ()) -> Cancellable {
        let action = StubAction(URL: target.fullURL, method: target.method)

        var response = (target as? TargetWithSampleType)?.sampleResponse ?? self.defaultResponse
        var behavior = self.defaultBehavior

        if let stubRule = self.stubs[action] {
            response = stubRule.conditionalResponse(request: request, target: target)
            behavior = stubRule.behavior ?? behavior
        }

        let cancellableToken = StubCancellableToken()
