"adrian@jboss.org" wrote:
Raise a JIRA issue to turn this into a proper spi, but don't do it now,
I don't want any more moving targets over the next couple of days. :-)
What should we consider a proper spi here? 
I've added this abstract class, which holds all the "callbacks" that are required from GenericBeanFactoryMetaData. 
package org.jboss.beans.metadata.spi.factory;
import java.util.Map;
import java.util.List;
import org.jboss.beans.info.spi.BeanAccessMode;
import org.jboss.beans.info.spi.BeanInfo;
import org.jboss.beans.metadata.spi.ClassLoaderMetaData;
import org.jboss.beans.metadata.spi.ConstructorMetaData;
import org.jboss.beans.metadata.spi.LifecycleMetaData;
import org.jboss.beans.metadata.spi.ValueMetaData;
import org.jboss.beans.metadata.spi.ParameterMetaData;
import org.jboss.kernel.spi.config.KernelConfigurator;
import org.jboss.joinpoint.spi.MethodJoinpoint;
import org.jboss.joinpoint.spi.JoinpointException;
/**
 * SPI contract of bean factory we can create from GenericBeanFactoryMetaData.
 *
 * @author <a href="mailto:ales.justin@jboss.com">Ales Justin</a>
 */
public abstract class AbstractBeanFactory implements BeanFactory
{
 /** The configurator */
 protected KernelConfigurator configurator;
 /** The bean class name */
 protected String bean;
 /** The access mode */
 protected BeanAccessMode accessMode;
 /** The classloader */
 protected ClassLoaderMetaData classLoader;
 /** The constructor metadata */
 protected ConstructorMetaData constructor;
 /** The properties Map<propertyName, ValueMetaData> */
 protected Map<String, ValueMetaData> properties;
 /** The create lifecycle method */
 protected LifecycleMetaData create;
 /** The start lifecycle method */
 protected LifecycleMetaData start;
 protected AbstractBeanFactory(KernelConfigurator configurator)
 {
 if (configurator == null)
 throw new IllegalArgumentException("Null configurator");
 this.configurator = configurator;
 }
 /**
 * Get the configurator.
 *
 * @return the configurator
 */
 protected KernelConfigurator getConfigurator()
 {
 return configurator;
 }
 /**
 * Get the bean name
 *
 * @return the bean
 */
 public String getBean()
 {
 return bean;
 }
 /**
 * Set the bean name
 *
 * @param bean the bean name
 */
 public void setBean(String bean)
 {
 this.bean = bean;
 }
 /**
 * Get the access mode.
 *
 * @return the access mode
 */
 public BeanAccessMode getAccessMode()
 {
 return accessMode;
 }
 /**
 * Set the access mode.
 *
 * @param accessMode the access mode.
 */
 public void setAccessMode(BeanAccessMode accessMode)
 {
 this.accessMode = accessMode;
 }
 /**
 * Get the classLoader.
 *
 * @return the classLoader.
 */
 public ClassLoaderMetaData getClassLoader()
 {
 return classLoader;
 }
 /**
 * Set the classLoader.
 *
 * @param classLoader the classLoader.
 */
 public void setClassLoader(ClassLoaderMetaData classLoader)
 {
 this.classLoader = classLoader;
 }
 /**
 * Get the constructor metadata
 *
 * @return the contructor metadata
 */
 public ConstructorMetaData getConstructor()
 {
 return constructor;
 }
 /**
 * Set the constructor metadata
 *
 * @param constructor the constructor metadata
 */
 public void setConstructor(ConstructorMetaData constructor)
 {
 this.constructor = constructor;
 }
 /**
 * Get the properties
 *
 * @return the properties Map<propertyName, ValueMetaData>
 */
 public Map<String, ValueMetaData> getProperties()
 {
 return properties;
 }
 /**
 * Set the properties
 *
 * @param properties the properties Map<propertyName, ValueMetaData>
 */
 public void setProperties(Map<String, ValueMetaData> properties)
 {
 this.properties = properties;
 }
 /**
 * Get the create.
 *
 * @return the create.
 */
 public LifecycleMetaData getCreate()
 {
 return create;
 }
 /**
 * Set the create.
 *
 * @param create the create.
 */
 public void setCreate(LifecycleMetaData create)
 {
 this.create = create;
 }
 /**
 * Get the start.
 *
 * @return the start.
 */
 public LifecycleMetaData getStart()
 {
 return start;
 }
 /**
 * Set the start.
 *
 * @param start the start.
 */
 public void setStart(LifecycleMetaData start)
 {
 this.start = start;
 }
 /**
 * Invoke a lifecycle method
 *
 * @param methodName the default method name
 * @param lifecycle the lifecycle
 * @param info the bean info
 * @param cl the classloader
 * @param target the target
 * @throws Throwable for any error
 */
 protected void invokeLifecycle(String methodName, LifecycleMetaData lifecycle, BeanInfo info, ClassLoader cl, Object target) throws Throwable
 {
 if (lifecycle == null || lifecycle.isIgnored() == false)
 {
 String method = methodName;
 if (lifecycle != null && lifecycle.getMethodName() != null)
 method = lifecycle.getMethodName();
 List<ParameterMetaData> parameters = null;
 if (lifecycle != null)
 parameters = lifecycle.getParameters();
 MethodJoinpoint joinpoint;
 try
 {
 joinpoint = configurator.getMethodJoinPoint(info, cl, method, parameters, false, true);
 }
 catch (JoinpointException ignored)
 {
 return;
 }
 joinpoint.setTarget(target);
 joinpoint.dispatch();
 }
 }
}