Pustefix components should interact using services and extension points.
A component should be able to supply services to other components by exporting them. Components can consume exported services by importing them. The services are represented by interfaces. Services have to support versioning (declaring the version of exported/imported services).
Components should be able to interact using extension points. A component can define extension points where other components can be plugged in/registered. Within Java code an extension point normally will be defined using an interface, which can be implemented by other components. Components can provide extension points to other components by exporting them (including version and cardinality declaration, e.g. allowing 0..1, 1..n). Components can be registered at exported extension points by importing them (including version declaration) and e.g. setting an implementation class.