..
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.



.. _core_framework:

Plugin API reference
====================
The core public APIs are of interest to anyone who wishes to
implement custom :mod:`Element <buildstream.element>` or
:mod:`Source <buildstream.source>` plugins, and can also be
useful for working on BuildStream itself.

.. toctree::
   :maxdepth: 1

   buildstream.types
   buildstream.node
   buildstream.plugin
   buildstream.source
   buildstream.sourcemirror
   buildstream.downloadablefilesource
   buildstream.element
   buildstream.buildelement
   buildstream.scriptelement
   buildstream.sandbox.sandbox
   buildstream.storage.directory
   buildstream.exceptions
   buildstream.utils
