package jalse.entities.functions;
import static jalse.entities.functions.Functions.checkNoParams;
import static jalse.entities.functions.Functions.checkNoReturnType;
import static jalse.entities.functions.Functions.checkNotDefault;
import static jalse.entities.functions.Functions.getIDSuppliers;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.UUID;
import java.util.function.Supplier;
import jalse.entities.DefaultEntityProxyFactory;
import jalse.entities.Entity;
import jalse.entities.EntityContainer;
import jalse.entities.annotations.EntityID;
import jalse.entities.annotations.KillEntities;
import jalse.entities.methods.KillEntitiesMethod;
/**
* This is a method function for {@link KillEntities} annotation. It will resolve an
* {@link KillEntitiesMethod} to be used by the entity typing system. This differs from the usual
* killing of {@link Entity} as it also lets kill a subset of {@link Entity} using {@link EntityID}
* (so adding to any method will cause it to filter).<br>
* <br>
* The next example signature will resolve to {@link EntityContainer#killEntities()}.
*
* <pre>
* <code>
* {@code @KillEntities}
* void killGhosts();
* </code>
* </pre>
*
* The next example signature will show how to use one of the above examples with a subset.
*
* <pre>
* <code>
* {@code @EntityID(mostSigBits = 0, leastSigBits = 1)}
* {@code @EntityID(mostSigBits = 0, leastSigBits = 2)}
* {@code @EntityID(mostSigBits = 0, leastSigBits = 3)}
* {@code @EntityID(mostSigBits = 0, leastSigBits = 4)}
* {@code @EntityID(mostSigBits = 0, leastSigBits = 5)}
* {@code @KillEntities}
* void killGhosts();
* </code>
* </pre>
*
* NOTE: This function will throw exceptions if {@link KillEntities} is present but the method
* signature is invalid.
*
* @author Elliot Ford
*
* @see DefaultEntityProxyFactory
*
*/
public class KillEntitiesFunction implements EntityMethodFunction {
@Override
public KillEntitiesMethod apply(final Method m) {
// Check for annotation
final KillEntities annonation = m.getAnnotation(KillEntities.class);
if (annonation == null) {
return null;
}
// Basic check method signature
checkNoReturnType(m);
checkNoParams(m);
checkNotDefault(m);
// Create ID suppliers
final Set<Supplier<UUID>> idSuppliers = getIDSuppliers(m);
// Create stream entities method
return new KillEntitiesMethod(idSuppliers);
}
}