
\chapter{Introduction}

Coopr leverages the PyUtilib Component Architecture (PCA) to support
plugins that extend Coopr's built-in functionality.  PCA supports an
object oriented approach to software design, which is an accepted strategy
for managing software complexity in large systems.  Object oriented
design is traditionally done using classes and class inheritance;  classes
define interfaces, which are extended and customized in subclasses using
class inheritance.

The main idea behind PCA is to separate the declaration of component
interfaces from their implementation.  This allows for a more flexible
design of software components that further encourages modularity of
components.  Additionally, PCA includes a global component registry, as
well as a framework for automating the execution of components that match
a given interface.  This capability facilitates the dynamic registration
and application of components within large software systems.

The plugin components supported by Coopr have a variety of signficant impacts
on the development and deployment of Coopr applications:
\begin{itemize}

\item Plugins facilitate extensions of Coopr without risk of destabilizing core functionality.  

\item Plugins allow third-party developers to add value without requiring direct involvement of the core developers.  For example, Pyomo extensions can be developed and distributed without requiring developer access to Coopr's subversion repository.  Similarly, third-party developers can develop 
plugins that are specific to their working environment or business needs.

\item The PCA can automate the activation of external software interfaces, based on the user's environment.  For example, optimization solvers can be
automatically registered if they are found with the user's \code{PATH} environment.

\item New capabilities can be dynamically loaded at run-time.  Python EGG files provide a standard, modular mechanism for distributing plugins.  The PCA can dynamically load EGG files, which allows users to dynamically activate 
plugins.

\end{itemize}



Chapter~\ref{chap:pca} provides a detailed description of the PyUtilib
Component Architecture.  Chapter~\ref{chap:coopr} descripts the plugin
interfaces that are supported in Coopr.  Further, this chapter provides
examples for how these plugins can be used to augment the Coopr's core
functionality.


