public DslPointcut<T, V> and(final DslPointcut<T, V> next) {
    final DslPointcut<T, V> first = this;
    return new DslPointcut<>() {
      @Override
      List<V> matches(T src, ProcessingContext context) {
        final List<V> vs1 = first.matches(src, context);
        if (vs1 == null) return null;

        final List<V> vs2 = next.matches(src, context);
        if (vs2 == null) return null;

        final List<V> result = new ArrayList<>(vs1);
        result.retainAll(new HashSet<>(vs2));
        return result;
      }

      @Override
      boolean operatesOn(Class c) {
        return first.operatesOn(c) && next.operatesOn(c);
      }
    };
  }
public DslPointcut<T, V> and(final DslPointcut<T, V> next)