Component infrastructure * support simple component - requires through constructor - provides through getters * support pre-instantiated components * optional start and stop methods * directly implementing the Component interface * explicit wiring must be possible * giving names to a component must be optional * support for cached components and non-cached components. - rename System -> Component - rename CompositeComponent -> Container - qualified name zetten in de start methode - testen op multiple start methodes. - geneste service registry maken, testen dat een component alleen maar die componenten in de registry ziet die hij daadwerkelijk mag gebruiken - validate() in start() methode aanroepen. - validate() moet public zijn - Container abstraheren in API addComponent(Component) methode toevoegen voor component addComponent(name, component) methode toevoegen voor component. - Toevoegen van Constraint interface Constraint.isAllowed(provider, ProvidedInterface, client, RequiredInterface) Eenvoudige constraint implementeren voor expliciete binding van provided en required interfaces. CompositeConstraint implementeren. CompositeConstraint checken voor elke potentiele match. - Annotaties definieren @Component class MyComponent { public MyComponent(Def aArg, Ghi aArg2) { } @Provided(name = "name") public Xyz getXyz(); @Start public void myStart(); // Unlike the component } - constraint definieren om constructor te selecteren. // Select the constructor or setter to use. ArgumentConstraints(Class[] argTypes) // indicate which provided interface from what other component must be // used for the i-th parameter. constraint.require(int i, new ProvidedConstraint(component, intf)); // indicate the value to substitute for the i-th parameter. constraint.setValue(int i, Object aValue); - Algemene classes maken die de constructor, start method, en methodes identificeren om de component als Component te benaderen. in een object, samen met een wrapper die deze info gebruikt om het object als Component te exportern. Er moet ook een wrapper zijn voor reeds geinstantieerde objecten. - wrapper maken die geannoteerde classes interpreteert en via de eerdere wrapper het object ontsluiten als component. Zowel geinstantieerde objecten als classes ondersteunen. - constructor toevoegen aan de container voor addComponent(Class) // use constructor with the most arguments addComponent(Class, ArgumentConstraints) // use explicit constructor addRunningComponent(Object) // running component with annotations or // subclass of Component addComponent(Object, ComponentAdapterInfo) // running component with // info on how to adapt it to a component.