[/==============================================================================
    Copyright (C) 2001-2010 Joel de Guzman
    Copyright (C) 2001-2005 Dan Marsden
    Copyright (C) 2001-2010 Thomas Heller

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
===============================================================================/]

[section Organization]

Care and attention to detail was given, painstakingly, to the design and
implementation of Phoenix.

The library is organized in four layers:

# Actor
# Value, Reference, Arguments
# Function, Operator, Object, Statement, Scope
# STL, Fusion, Bind

[/$images/organization.png]

The modules are orthogonal, with no cyclic dependencies.
Lower layers do not depend on higher layers. Modules in a layer do not depend on other modules in the same layer.
This means, for example, that Bind can be completely discarded if it is
not required; or one could perhaps take out Operator and Statement and just use Function,
which may be desirable in a pure FP application.

The library has grown from the original Phoenix but still comprises only
header files. There are no object files to link against.

[h2 Core]

The lowest two layers comprise the core.

The [link phoenix.actor `Actor`] is the main concept behind the library. Lazy functions are
abstracted as actors.

Terminals provide the basic building blocks of functionality within Phoenix.
Expressions are used to combine these terminals together to provide more
powerful functionality.

Expressions are composed of zero or more actors. Each actor in a composite can
again be another expression.

[table Modules
    [[Module]           [Description]]
    [[Function]         [Lazy functions support (e.g. `add`)]]
    [[Operator]         [Lazy operators support (e.g. `+`)]]
    [[Statement]        [Lazy statements (e.g. `if_`, `while_`)]]
    [[Object]           [Lazy casts (e.g. `static_cast_`),
                        object creation destruction (e.g.
                        `new_`, `delete_`)]]
    [[Scope]            [Support for scopes, local variables and lambda-lambda]]
    [[Bind]             [Lazy functions from free functions, member functions or member variables.]]
    [[STL Container]        [Set of predefined "lazy" functions that work on STL
                        containers and sequences (e.g. `push_back`).]]
    [[STL Algorithm]        [Set of predefined "lazy" versions of the STL algorithms
                        (e.g. `find_if`).]]
]

Each module is defined in a header file with the same name. For example,
the core module is defined in `<boost/phoenix/core.hpp>`.

[table Includes
    [[Module]           [File]]
    [[Core]             [`#include <boost/phoenix/core.hpp>`]]
    [[Function]         [`#include <boost/phoenix/function.hpp>`]]
    [[Operator]         [`#include <boost/phoenix/operator.hpp>`]]
    [[Statement]        [`#include <boost/phoenix/statement.hpp>`]]
    [[Object]           [`#include <boost/phoenix/object.hpp>`]]
    [[Scope]            [`#include <boost/phoenix/scope.hpp>`]]
    [[Bind]             [`#include <boost/phoenix/bind.hpp>`]]
    [[Container]        [`#include <boost/phoenix/stl/container.hpp>`]]
    [[Algorithm]        [`#include <boost/phoenix/stl/algorithm.hpp>`]]
]

[blurb __tip__ Finer grained include files are available per feature; see the
succeeding sections.]

[endsect]

