private FactoryBodyGenerator selectBodyGenerator(final InjectableType factoryType, final String typeName, final Injectable injectable) { final FactoryBodyGenerator generator; switch (factoryType) { case Type: generator = new TypeFactoryBodyGenerator(); break; case Provider: generator = new ProviderFactoryBodyGenerator(); break; case JsType: generator = new JsTypeFactoryBodyGenerator(); break; case Producer: generator = new ProducerFactoryBodyGenerator(); break; case ContextualProvider: generator = new ContextualFactoryBodyGenerator(); break; case ExtensionProvided: if (!(injectable instanceof CustomFactoryInjectable)) { throw new RuntimeException(String.format("The injectable, %s, for %s is extension provided but is not a %s", injectable.toString(), typeName, CustomFactoryInjectable.class.getSimpleName())); } generator = ((CustomFactoryInjectable) injectable).getGenerator(); break; default: throw new RuntimeException(factoryType + " not yet implemented!"); } return generator; }