This package allows orthogonal extensions of the most widely used classes derived from uvm_component (uvm_test, uvm_env, uvm_component, uvm_driver, uvm_sequencer and a few more) etc. For a full list just look at the code. 

Each of these classes is extended with a list of facade objects of type component_aspect. These object have an m_parent field that allows them to access the parent component. They also have hooks that are called by the parent at various strategic points. For example a "build_hook" that is called before the parent build_phase() is executed and allows the facade to do things at the right moment. More hooks could be added.

The most problematic point about this package is supporting list of facades so that components could have multiple independent vertical extensions. At the moment this is done by adding all facades into a global package scope list, that is copied by each component to a local one during new(). 

Examples:
The package doesn't have its own native examples. For use examples look for the automatic_tb_dut package that uses this package to extend all component derived classed with an hdl_path field and some associated functionality.

Gotchas:
Since the base class calls the facade's hooks, users must call the base class implementation of each phase. Even for phases where this is not common such as run_phase(). Otherwise, the facades don't get a chance to execute what they need to do for the phase.

