This discusses the various ways you can make Nimbus components behave differently, either by activating/switching pre-existing plugins or by creating a new plugin/component to replace a current extensibility point.
The Nimbus FAQ is good prerequisite reading for this section, especially this section.
Each Nimbus component can be sanely replaced by something that implements the same interface or protocol.
This provides a wide range of possibilities. For example, this summer saw a drop-in workspace-control replacement that adds support for KVM virtual machines (this is a Google Summer of Code project whose result should be integrated into Nimbus officially in the future).
Also in many cases the pieces can be used on their own.
There is an integration with OpenNebula discussed here, an integration with Nagios discussed here, and an integration with MDS discussed here.
On top of all this, most of the Java based components have the built-in ability to define their internal modules at runtime via configuration files. This is achieved by using the Spring framework dependency injection container.
The workspace service has the most of these internal "plug points" (around 50, all told, although it would be esoteric to replace some of them).
The major ones are outlined on the following pages:
A beginning exercise to start developing plugins would be to: