@SuppressWarnings({ "unchecked", "rawtypes" })
public static <T> Creator<T> create(Class<T> c, Habitat habitat, MultiMap<String,String> metadata) {
Factory f = c.getAnnotation(Factory.class);
if (f != null) {
return new FactoryCreator<T>(c,f.value(),habitat,metadata);
}
Inhabitant factory = habitat.getInhabitantByAnnotation(FactoryFor.class, c.getName());
if (factory != null) {
return new FactoryCreator<T>(c,factory,habitat,metadata);
}
boolean isAbstract = Modifier.isAbstract(c.getModifiers());
if (!isAbstract) {
Reference<Constructor<T>> defaultCtorRef = new Reference();
Reference<Constructor<T>> noArgCtorRef = new Reference();
qualifyingConstructors(c, null, getInjectionAnnotations(habitat), defaultCtorRef, noArgCtorRef);
if (defaultCtorRef.get() != null) {
return new InjectableParametizedConstructorCreator<T>(c, defaultCtorRef.get(), habitat, metadata);
}
if (noArgCtorRef.get() != null) {
return new ConstructorCreator<T>(c,habitat,metadata);
}
}
return null;
}