/******************************************************************************* * Copyright (c) 2010 Fraunhofer IWU and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Fraunhofer IWU - initial API and implementation *******************************************************************************/ package net.enilink.composition; import net.enilink.composition.asm.BehaviourClassProcessor; import net.enilink.composition.asm.BehaviourMethodProcessor; import net.enilink.composition.asm.DefaultBehaviourFactory; import net.enilink.composition.asm.processors.BehaviourConstructorGenerator; import net.enilink.composition.asm.processors.BehaviourInterfaceImplementor; import net.enilink.composition.asm.processors.MethodDelegationGenerator; import net.enilink.composition.mappers.DefaultRoleMapper; import net.enilink.composition.mappers.RoleMapper; import net.enilink.composition.mappers.TypeFactory; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; public class CompositionModule<T> extends AbstractModule { private Multibinder<BehaviourFactory> behaviourFactoryBinder; private Multibinder<BehaviourClassProcessor> classProcessorBinder; private Multibinder<BehaviourMethodProcessor> methodProcessorBinder; protected void bindClassDefiner() { bind(ClassDefiner.class).in(Singleton.class); } @Override protected void configure() { initBindings(); } protected Multibinder<BehaviourClassProcessor> getBehaviourClassProcessorBinder() { if (classProcessorBinder == null) { classProcessorBinder = Multibinder.newSetBinder(binder(), BehaviourClassProcessor.class); } return classProcessorBinder; } protected Multibinder<BehaviourFactory> getBehaviourFactoryBinder() { if (behaviourFactoryBinder == null) { behaviourFactoryBinder = Multibinder.newSetBinder(binder(), BehaviourFactory.class); } return behaviourFactoryBinder; } protected Multibinder<BehaviourMethodProcessor> getBehaviourMethodProcessorBinder() { if (methodProcessorBinder == null) { methodProcessorBinder = Multibinder.newSetBinder(binder(), BehaviourMethodProcessor.class); } return methodProcessorBinder; } protected void initBindings() { getBehaviourClassProcessorBinder().addBinding().to( BehaviourInterfaceImplementor.class); getBehaviourClassProcessorBinder().addBinding().to( BehaviourConstructorGenerator.class); getBehaviourMethodProcessorBinder().addBinding().to( MethodDelegationGenerator.class); getBehaviourFactoryBinder().addBinding().to( DefaultBehaviourFactory.class); bindClassDefiner(); } protected RoleMapper<T> createRoleMapper(TypeFactory<T> typeFactory) { return new DefaultRoleMapper<T>(typeFactory); } protected void initRoleMapper(RoleMapper<T> roleMapper, TypeFactory<T> typeFactory) { } @Provides @Singleton protected RoleMapper<T> provideRoleMapper(TypeFactory<T> typeFactory) { RoleMapper<T> roleMapper = createRoleMapper(typeFactory); initRoleMapper(roleMapper, typeFactory); return roleMapper; } }