/** @mainpage Qore reflection Module

    @tableofcontents

    @section reflectionintro reflection Module Introduction

    The \c reflection module allows for %Qore code to search and list the definitions and declarations
    in a %Qore @ref Qore::Program "Program" object.

    This module is released under the MIT license (see \c COPYING.MIT in the source distribution for
    more information).  The module is tagged as such in the module's header (meaning it can be loaded
    unconditionally regardless of how the %Qore library was initialized).

    To use the module in a %Qore script, use the \c %%requires directive as follows:
    @code %requires reflection @endcode

    To prohibit reflection in a @ref Qore::Program "Program" object; use the @ref Qore::PO_NO_REFLECTION "PO_NO_REFLECTION"
    sandbox restriction when creating the object or when setting sandboxing restrictions on the
    @ref Qore::Program "Program" object.

    Classes provided by this module:
    - @ref Qore::Reflection::AbstractClass "AbstractClass"
    - @ref Qore::Reflection::AbstractClassMember "AbstractClassMember"
    - @ref Qore::Reflection::AbstractConstant "AbstractConstant"
    - @ref Qore::Reflection::AbstractMember "AbstractMember"
    - @ref Qore::Reflection::AbstractMethod "AbstractMethod"
    - @ref Qore::Reflection::AbstractMethodVariant "AbstractMethodVariant"
    - @ref Qore::Reflection::AbstractReflectionFunction "AbstractReflectionFunction"
    - @ref Qore::Reflection::AbstractVariant "AbstractVariant"
    - @ref Qore::Reflection::Class "Class"
    - @ref Qore::Reflection::ClassConstant "ClassConstant"
    - @ref Qore::Reflection::Constant "Constant"
    - @ref Qore::Reflection::ConstructorMethod "ConstructorMethod"
    - @ref Qore::Reflection::ConstructorMethodVariant "ConstructorMethodVariant"
    - @ref Qore::Reflection::CopyMethod "CopyMethod"
    - @ref Qore::Reflection::CopyMethodVariant "CopyMethodVariant"
    - @ref Qore::Reflection::DestructorMethod "DestructorMethod"
    - @ref Qore::Reflection::DestructorMethodVariant "DestructorMethodVariant"
    - @ref Qore::Reflection::Function "Function"
    - @ref Qore::Reflection::FunctionVariant "FunctionVariant"
    - @ref Qore::Reflection::GlobalVar "GlobalVar"
    - @ref Qore::Reflection::Namespace "Namespace"
    - @ref Qore::Reflection::NormalMember "NormalMember"
    - @ref Qore::Reflection::NormalMethod "NormalMethod"
    - @ref Qore::Reflection::NormalMethodVariant "NormalMethodVariant"
    - @ref Qore::Reflection::PseudoClass "PseudoClass"
    - @ref Qore::Reflection::PseudoMethod "PseudoMethod"
    - @ref Qore::Reflection::PseudoMethodVariant "PseudoMethodVariant"
    - @ref Qore::Reflection::StaticMember "StaticMember"
    - @ref Qore::Reflection::StaticMethod "StaticMethod"
    - @ref Qore::Reflection::StaticMethodVariant "StaticMethodVariant"
    - @ref Qore::Reflection::Type "Type"
    - @ref Qore::Reflection::TypedHash "TypedHash"
    - @ref Qore::Reflection::TypedHashMember "TypedHashMember"

    Constants:
    - @ref access_constants
    - @ref code_flag_constants
    - @ref modifier_constants
    - @ref pseudo_class_constants
    - @ref type_constants

    Typed hashes:
    - @ref Qore::ClassAccessInfo "ClassAccessInfo"

    Objects created from reflection classes provided by this module are wrappers over the actual C++ objects;
    for this reason comparing different objects with the @ref logical_equality_operator "==" or
    @ref logical_inequality_operator "!=" operators will not return the expected results.  To perform
    comparisons on reflection objects, use the \c isEqual() methods such as
    @ref Qore::Reflection::AbstractClass::isEqual() "AbstractClass::isEqual()",
    @ref Qore::Reflection::AbstractMember::isEqual() "AbstractMember::isEqual()", or
    @ref Qore::Reflection::Namespace::isEqual() "Namespace::isEqual()", among others.

    @section reflection_examples Examples

    @par Example:
    @code{.py}
#!/usr/bin/env qore

%new-style
%require-types
%strict-args
%enable-all-warnings

%requires reflection

Class c = Class::forName("Condition");
AbstractMethodVariant v = c.getVariant("wait", Class::forName("AbstractSmartLock").getType(), TimeoutType);
printf("%s\n", v.toString());
# produces the following output:
# public int Condition::wait(object<AbstractSmartLock> lock, timeout timeout_ms = 0)
    @endcode

    @section reflectionreleasenotes reflection Module Release Notes

    This module is always delivered with %Qore and therefore mirrors the %Qore version.
*/
