package org.nuunframework.ensemble.api; import org.nuunframework.ensemble.Ensemble; import org.nuunframework.ensemble.Ensemble.NULL; import org.nuunframework.ensemble.engine.Role; import org.nuunframework.ensemble.engine.RoleImpl; import org.nuunframework.ensemble.util.Assert; import org.nuunframework.ensemble.util.TypeResolver; public abstract class Soloist<R1> extends Ensemble<R1,NULL> { protected R1 instance1; public final Class<R1> roleClass1; protected RoleImpl role1; @SuppressWarnings({ "unchecked", "rawtypes" }) public Soloist() { super(); Class<? extends Soloist> subclass = getClass(); Class<?>[] typeArguments = TypeResolver.resolveArguments(subclass, Soloist.class); Assert.notNull(typeArguments, "Must declare role type argument <R> for Soloist"); roleClass1 = (Class<R1>) typeArguments[typeArguments.length - 1]; instance1 = injector.getInstance(roleClass1); role1 = new RoleImpl("role1"); listRoles.add(role1); listClassRoles.add(roleClass1); } public R1 actor1() { this.context.stackRole.push(role1); return instance1; } public Role role1() { return role1; } }