SaacFunctionCollection.java
package eu.javaexperience.saac;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import eu.javaexperience.collection.map.NullMap;
import eu.javaexperience.datareprez.DataObject;
import eu.javaexperience.datareprez.javaImpl.DataObjectJavaImpl;
import eu.javaexperience.functional.saac.Functions;
import eu.javaexperience.functional.saac.Functions.PreparedFunction;
import eu.javaexperience.saac.SaacEnv.SaacGetByWrapper;
public class SaacFunctionCollection
{
protected Map<String, PreparedFunction> functionSet = new HashMap<>();
protected void registerClasses(Class<?>... clss)
{
ArrayList<PreparedFunction> funcs = new ArrayList<>();
for(Class<?> cls:clss)
{
Functions.collectFunctions(funcs, cls);
}
for(PreparedFunction f:funcs)
{
functionSet.put(f.getId(), f);
}
}
public SaacFunctionCollection(Class... functionClasses)
{
registerClasses(functionClasses);
}
public Map<String, PreparedFunction> getFunctions()
{
return functionSet;
}
public <T> T createFunction(Class<T> ret, Map<String, Object> func)
{
return createFunction(ret, new DataObjectJavaImpl(func));
}
public <T> T createFunction(Class<T> ret, DataObject func)
{
return createFunction(ret, false, func);
}
public <T> T createFunction(Class<T> ret, boolean envDepend, Map<String, Object> func)
{
return createFunction(ret, envDepend, new DataObjectJavaImpl(func));
}
public <T> T createFunction(Class<T> ret, boolean envDepend, DataObject func)
{
SaacEnv env = SaacEnv.create(functionSet, func, ret);
Object root = env.getRoot();
if(!envDepend)
{
if(root instanceof SaacGetByWrapper)
{
root = ((SaacGetByWrapper)root).getBy(NullMap.instance);
}
}
return (T) root;
}
public <T> T createEnvFunction(Class<T> cls, Map<String, Object> impl)
{
return createFunction(cls, true, impl);
}
public <T> T createEnvFunction(Class<T> cls, DataObject impl)
{
return createFunction(cls, true, impl);
}
}