class StepListenerParser extends AbstractListenerParser {

	private static final String LISTENERS_ELE = "listeners";

	private static final String MERGE_ATTR = "merge";

	private final ListenerMetaData[] listenerMetaData;

	public StepListenerParser() {
		this(StepListenerMetaData.values());
	}

	public StepListenerParser(ListenerMetaData[] listenerMetaData) {
		this.listenerMetaData = listenerMetaData;
	}

	@Override
	protected Class<? extends AbstractListenerFactoryBean<?>> getBeanClass() {
		return StepListenerFactoryBean.class;
	}

	@Override
	protected ListenerMetaData[] getMetaDataValues() {
		return listenerMetaData;
	}

	@SuppressWarnings("unchecked")
	public void handleListenersElement(Element stepElement, BeanDefinition beanDefinition,
			ParserContext parserContext) {<FILL_FUNCTION_BODY>}

}

		MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
		List<Element> listenersElements = DomUtils.getChildElementsByTagName(stepElement, LISTENERS_ELE);
		if (listenersElements.size() == 1) {
			Element listenersElement = listenersElements.get(0);
			CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(listenersElement.getTagName(),
					parserContext.extractSource(stepElement));
			parserContext.pushContainingComponent(compositeDef);
			ManagedList<BeanDefinition> listenerBeans = new ManagedList<>();
			if (propertyValues.contains("listeners")) {
				listenerBeans = (ManagedList<BeanDefinition>) propertyValues.getPropertyValue("listeners").getValue();
			}
			listenerBeans.setMergeEnabled(listenersElement.hasAttribute(MERGE_ATTR)
					&& Boolean.parseBoolean(listenersElement.getAttribute(MERGE_ATTR)));
			List<Element> listenerElements = DomUtils.getChildElementsByTagName(listenersElement, "listener");
			if (listenerElements != null) {
				for (Element listenerElement : listenerElements) {
					listenerBeans.add(parse(listenerElement, parserContext));
				}
			}
			propertyValues.addPropertyValue("listeners", listenerBeans);
			parserContext.popAndRegisterContainingComponent();
		}
	
<methods>public non-sealed void <init>() ,public void doParse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext, org.springframework.beans.factory.support.BeanDefinitionBuilder) ,public org.springframework.beans.factory.support.AbstractBeanDefinition parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext) ,public static org.springframework.beans.BeanMetadataElement parseListenerElement(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext, org.springframework.beans.factory.config.BeanDefinition) <variables>private static final java.lang.String BEAN_ELE,private static final java.lang.String ID_ATTR,private static final java.lang.String REF_ATTR,private static final java.lang.String REF_ELE