  There are two kinds of location monitoring in iOS: significant updates and standard location monitoring.
  Significant updates are more power efficient, but have limitations on accuracy and update frequency.
  */
-private enum LocationMonitoring {
+private enum LocationMonitoring: Comparable {
     /// Monitor for only "significant updates" to the user's location (using cell towers only)
     case SignificantUpdates
     /// Monitor for all updates to the user's location (using GPS, WiFi, etc)
     case Standard
+}
+
+private func < (lhs: LocationMonitoring, rhs: LocationMonitoring) -> Bool {
+    switch (lhs, rhs) {
+    case (.SignificantUpdates, .Standard):
+        return true
+    default:
+        return false
+    }
 }
 
 private extension LocationAccuracy {

            self.request = request
        }
        
        func shouldUpdateListenerForLocation(location: CLLocation) -> Bool {
            switch request.updateFrequency {
            case .Continuous:

        return manager.coreLocationAuthorizationStatus
    }

    /// The monitoring mode for the current state.
    ///
    /// This takes into account the listeners' monitoring modes and the authorization status.
    private var monitoringMode: LocationMonitoring? {
        guard authorizationStatus.allowsMonitoring else {
            return nil
        }

        guard let value = allLocationListeners.map({ $0.monitoringMode }).maxElement() else {
            return nil
        }

        if authorizationStatus.requiresStandardMonitoring {
            return .Standard
        }

        return value
    }

    /// The desired accuracy for the current state.
    private var desiredAccuracy: CLLocationAccuracy {
        // Note: CLLocationAccuracy is expressed as an allowable amount of error, so we want the "minimum" value.

        guard let value = allLocationListeners.map({ $0.desiredAccuracy }).minElement() else {
            return kCLLocationAccuracyHundredMeters
        }

        return value
    }

    /// The distance filter for the current state.
    private var distanceFilter: CLLocationDistance {
        guard let value = allLocationListeners.map({ $0.distanceFilter }).minElement() else {
            return kCLDistanceFilterNone
        }

        return value
    }

    override convenience init() {
