<?xml version="1.0" encoding="UTF-8"?>
<chapter version="5.1" xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xmlns:trans="http://docbook.org/ns/transclusion"
         xmlns:svg="http://www.w3.org/2000/svg"
         xmlns:m="http://www.w3.org/1998/Math/MathML"
         xmlns:html="http://www.w3.org/1999/xhtml"
         xmlns:db="http://docbook.org/ns/docbook">
  <title>Modules API</title>

  <para>Modules Resolution is a process of finding out which modules should be
  preloaded for a correct compilation of a given module.</para>

  <para>Resolution expected to use <code>bind_module</code>,
  <code>modules_require</code> as an input and produce results in form of
  <code>modules_resolution</code> data table.</para>

  <section>
    <title>Module Annotations: 'bind_module'</title>

    <synopsis>SYNTAX:
**bind_module**(//module-ref//, //annotation//)</synopsis>

    <itemizedlist>
      <listitem>
        <para><emphasis>module-ref</emphasis> module's path</para>
      </listitem>
    </itemizedlist>

    <para>Declares module annotations.</para>

    <para>Example:</para>

    <programlisting>module:: status(obsolete).</programlisting>

    <para>Produced fact:
    <code>bind_module(path/to/module, status(obsolete))</code></para>
  </section>

  <section>
    <title>Requesting Modules: 'modules_require'</title>

    <synopsis>SYNTAX:
**modules_require**(//module-ref//, //request//)</synopsis>

    <itemizedlist>
      <listitem>
        <para><emphasis>module-ref</emphasis> module's path</para>
      </listitem>

      <listitem>
        <para><emphasis>request</emphasis> expressed by annotation</para>
      </listitem>
    </itemizedlist>

    <para>Module can request other modules necessary for correct work.
    Declared requests can be processed to find a resolution.</para>

    <para>Example:</para>

    <programlisting>module 
{
  require(logger).
}</programlisting>

    <para>Produced declaration:
    <code>modules_require(/path/to/module, logger)</code></para>
  </section>

  <section>
    <title>Modules Resolution: 'modules_resolution'</title>

    <synopsis>SYNTAX:
**modules_resolution**(//request//, //module-resolved-ref//)                         (1)
**modules_resolution**(//request//, //module-resolved-ref//, //module-context-ref//) (2)
</synopsis>

    <itemizedlist>
      <listitem>
        <para><emphasis>request</emphasis> expressed by annotation</para>
      </listitem>

      <listitem>
        <para><emphasis>module-resolved-ref</emphasis> resolved module's
        path</para>
      </listitem>

      <listitem>
        <para><emphasis>module-context-ref</emphasis> context module's
        path</para>
      </listitem>
    </itemizedlist>

    <para>Xreate uses the data table to find correspondent modules for each
    request.</para>

    <para>Form (1) assigns resolved module to a request and assumes that
    assignment is valid in all cases, i.e. whenever compiler encounters
    request it loads associated module.</para>

    <para>Form (2) assigns resolution valid only in a specific context.
    Compiler uses particular resolution only for requests that came from a
    module specified in a context. In other words, form (2) allows to resolve
    the same request differently for different modules depending on resolution
    strategy, thus implementing <emphasis>polymorphism on module
    level</emphasis>.</para>
  </section>

  <section>
    <title>See Also</title>

    <para>Syntax: <link xlink:href="/w/syntax/modules">Modules</link></para>
  </section>
</chapter>
