// Path: jadler-core/src/main/java/net/jadler/matchers/BodyRequestMatcher.java
// public static BodyRequestMatcher requestBody(final Matcher<? super String> pred) {
//     return new BodyRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/HeaderRequestMatcher.java
// public static HeaderRequestMatcher requestHeader(final String headerName,
//                                                  final Matcher<? super List<String>> pred) {
//     return new HeaderRequestMatcher(pred, headerName);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/MethodRequestMatcher.java
// public static MethodRequestMatcher requestMethod(final Matcher<? super String> pred) {
//     return new MethodRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/ParameterRequestMatcher.java
// public static ParameterRequestMatcher requestParameter(final String paramName,
//                                                        final Matcher<? super List<String>> pred) {
//     return new ParameterRequestMatcher(pred, paramName);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/PathRequestMatcher.java
// public static PathRequestMatcher requestPath(final Matcher<? super String> pred) {
//     return new PathRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/QueryStringRequestMatcher.java
// public static QueryStringRequestMatcher requestQueryString(final Matcher<? super String> pred) {
//     return new QueryStringRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/RawBodyRequestMatcher.java
// public static RawBodyRequestMatcher requestRawBody(final Matcher<byte[]> pred) {
//     return new RawBodyRequestMatcher(pred);
// }


import org.apache.commons.lang.Validate;
import org.hamcrest.Matcher;
import java.util.ArrayList;
import java.util.List;
import static net.jadler.matchers.BodyRequestMatcher.requestBody;
import static net.jadler.matchers.HeaderRequestMatcher.requestHeader;
import static net.jadler.matchers.MethodRequestMatcher.requestMethod;
import static net.jadler.matchers.ParameterRequestMatcher.requestParameter;
import static net.jadler.matchers.PathRequestMatcher.requestPath;
import static net.jadler.matchers.QueryStringRequestMatcher.requestQueryString;
import static net.jadler.matchers.RawBodyRequestMatcher.requestRawBody;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.notNullValue;

    /**
     * {@inheritDoc}
     */
    @Override
    public T havingMethod(final Matcher<? super String> predicate) {
        Validate.notNull(predicate, "predicate cannot be null");

        return that(requestMethod(predicate));
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public T havingBodyEqualTo(final String requestBody) {
        Validate.notNull(requestBody, "requestBody cannot be null, use an empty string instead");

        return havingBody(equalTo(requestBody));
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public T havingBody(final Matcher<? super String> predicate) {
        Validate.notNull(predicate, "predicate cannot be null");

// Path: jadler-core/src/main/java/net/jadler/matchers/BodyRequestMatcher.java
// public static BodyRequestMatcher requestBody(final Matcher<? super String> pred) {
//     return new BodyRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/HeaderRequestMatcher.java
// public static HeaderRequestMatcher requestHeader(final String headerName,
//                                                  final Matcher<? super List<String>> pred) {
//     return new HeaderRequestMatcher(pred, headerName);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/MethodRequestMatcher.java
// public static MethodRequestMatcher requestMethod(final Matcher<? super String> pred) {
//     return new MethodRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/ParameterRequestMatcher.java
// public static ParameterRequestMatcher requestParameter(final String paramName,
//                                                        final Matcher<? super List<String>> pred) {
//     return new ParameterRequestMatcher(pred, paramName);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/PathRequestMatcher.java
// public static PathRequestMatcher requestPath(final Matcher<? super String> pred) {
//     return new PathRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/QueryStringRequestMatcher.java
// public static QueryStringRequestMatcher requestQueryString(final Matcher<? super String> pred) {
//     return new QueryStringRequestMatcher(pred);
// }
// 
// Path: jadler-core/src/main/java/net/jadler/matchers/RawBodyRequestMatcher.java
// public static RawBodyRequestMatcher requestRawBody(final Matcher<byte[]> pred) {
//     return new RawBodyRequestMatcher(pred);
// }


// Path: jadler-core/src/main/java/net/jadler/AbstractRequestMatching.java
import org.apache.commons.lang.Validate;
import org.hamcrest.Matcher;
import java.util.ArrayList;
import java.util.List;
import static net.jadler.matchers.BodyRequestMatcher.requestBody;
import static net.jadler.matchers.HeaderRequestMatcher.requestHeader;
import static net.jadler.matchers.MethodRequestMatcher.requestMethod;
import static net.jadler.matchers.ParameterRequestMatcher.requestParameter;
import static net.jadler.matchers.PathRequestMatcher.requestPath;
import static net.jadler.matchers.QueryStringRequestMatcher.requestQueryString;
import static net.jadler.matchers.RawBodyRequestMatcher.requestRawBody;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.notNullValue;


    /**
     * {@inheritDoc}
     */
    @Override
    public T havingMethod(final Matcher<? super String> predicate) {
        Validate.notNull(predicate, "predicate cannot be null");

        return that(requestMethod(predicate));
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public T havingBodyEqualTo(final String requestBody) {
        Validate.notNull(requestBody, "requestBody cannot be null, use an empty string instead");

        return havingBody(equalTo(requestBody));
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public T havingBody(final Matcher<? super String> predicate) {
        Validate.notNull(predicate, "predicate cannot be null");

        return that(requestBody(predicate));