private TransformerFactory<?> getTransformerFactory(TransformModel transformModel) {
    TransformerFactoryClass transformerFactoryClass =
        transformModel.getClass().getAnnotation(TransformerFactoryClass.class);

    if (transformerFactoryClass == null) {
      TransformMessages.MESSAGES.transformModelNotAnnotated(transformModel.getClass().getName());
    }

    Class<?> factoryClass = transformerFactoryClass.value();
    if (!TransformerFactory.class.isAssignableFrom(factoryClass)) {
      TransformMessages.MESSAGES.invalidTransformerFactory(
          org.switchyard.transform.internal.TransformerFactory.class.getName());
    }

    try {
      if (!_transformerFactories.containsKey(factoryClass)) {
        TransformerFactory<?> factory = (TransformerFactory<?>) factoryClass.newInstance();
        _transformerFactories.put(factoryClass, factory);
      }

      return _transformerFactories.get(factoryClass);
    } catch (ClassCastException e) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (IllegalArgumentException iae) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (NullPointerException npe) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (InstantiationException ie) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    } catch (IllegalAccessException iae) {
      throw TransformMessages.MESSAGES.failedCreateInstanceofTransformerFactory(
          factoryClass.getName());
    }
  }