             return shouldLevelBeLoggedUsingMinLevelFilters(level, path: path, function: function)
         }
 
-        return passesLogLevelFilters(level) &&
-                passesPathFilters(path) &&
-                passesFunctionFilters(function) &&
-                passesMessageFilters(message)
+        return passesAllRequiredFilters(level, path: path, function: function, message: message) &&
+                passesAtLeastOneNonRequiredFilter(level, path: path, function: function, message: message)
     }
 
     func shouldLevelBeLoggedUsingMinLevelFilters(level: SwiftyBeaver.Level, path: String, function: String) -> Bool {

        }
    }

    func passesLogLevelFilters(level: SwiftyBeaver.Level) -> Bool {
        let logLevelFilters = getFiltersTargeting(Filter.TargetType.LogLevel(level), fromFilters: self.filters)
        return logLevelFilters.filter {

        }.count == logLevelFilters.count
    }

    func applyFilters(targetFilters: [FilterType], level: SwiftyBeaver.Level, path: String, function: String, message: String?) -> Int {
        return targetFilters.filter {
            filter in

            let passes:Bool

            switch filter.getTarget() {
            case .LogLevel(_):
                passes = filter.apply(level.rawValue)

            case .Path(_):
                passes = filter.apply(path)

            case .Function(_):
                passes = filter.apply(function)

            case .Message(_):
                guard let message = message else {
                    return false
                }

                passes = filter.apply(message)
            }

            return passes
        }.count
    }

  /**
