// Path: src/main/java/com/naskar/fluentquery/Join.java
// @FunctionalInterface
// public interface Join<J, T> {
// 	
// 	void accept(Query<J> q, T parent);
// 
// }
// 
// Path: src/main/java/com/naskar/fluentquery/Predicate.java
// public interface Predicate<T, R, I> {
// 
// 	I eq(R value);
// 	
// 	I ne(R value);
// 
// 	I gt(R value);
// 	
// 	I ge(R value);
// 
// 	I lt(R value);
// 	
// 	I le(R value);
// 	
// 	I like(R value);
// 	
// 	I isNull();
// 	
// 	I isNotNull();
// 	
// 	<J> I in(Class<J> clazz, Join<J, T>	 action);
// 	
// 	<J> I notIn(Class<J> clazz, Join<J, T> action);
// 
// }


import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import com.naskar.fluentquery.Join;
import com.naskar.fluentquery.Predicate;

package com.naskar.fluentquery.impl;



public class PredicateImpl<T, R, I, B> implements Predicate<T, R, B> {
	
	public enum Type { SPEC_AND, SPEC_OR, AND, OR };
	
	private B impl;
	private Function<T, R> property;
	private Type type;

// Path: src/main/java/com/naskar/fluentquery/Join.java
// @FunctionalInterface
// public interface Join<J, T> {
// 	
// 	void accept(Query<J> q, T parent);
// 
// }
// 
// Path: src/main/java/com/naskar/fluentquery/Predicate.java
// public interface Predicate<T, R, I> {
// 
// 	I eq(R value);
// 	
// 	I ne(R value);
// 
// 	I gt(R value);
// 	
// 	I ge(R value);
// 
// 	I lt(R value);
// 	
// 	I le(R value);
// 	
// 	I like(R value);
// 	
// 	I isNull();
// 	
// 	I isNotNull();
// 	
// 	<J> I in(Class<J> clazz, Join<J, T>	 action);
// 	
// 	<J> I notIn(Class<J> clazz, Join<J, T> action);
// 
// }


// Path: src/main/java/com/naskar/fluentquery/impl/PredicateImpl.java
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import com.naskar.fluentquery.Join;
import com.naskar.fluentquery.Predicate;

package com.naskar.fluentquery.impl;



public class PredicateImpl<T, R, I, B> implements Predicate<T, R, B> {
	
	public enum Type { SPEC_AND, SPEC_OR, AND, OR };
	
	private B impl;
	private Function<T, R> property;
	private Type type;

	private List<Consumer<Predicate<T, R, I>>> actions;
