SYNOPSIS
        #include <inherit_list.h>

        string * inherit_list()
        string * inherit_list(object|lwobject ob)
        string * inherit_list(object|lwobject ob, int flags)


DESCRIPTION
        Returns the names of all files inherited by <ob>, including
        <ob>s own filename. If <ob> is omitted, it defaults to the current
        object. The value of <flags> determines the structure of the output.

        <flag> = INHLIST_FLAT (0, default):
          The result is an array of filenames, starting the with the filename
          of <ob> itself, followed by the names of all inherited objects
          in breadth order.

        <flag> = INHLIST_TREE (1):
          The result is an array starting the with the filename
          of <ob> itself, followed by the all directly inherited
          objects. If one of the inherited objects has no inherits by itself,
          then its name will be stored directly in the array. If one inherited
          object has inherits by itself, a subvector will be created and
          stored in the result vector. The subvector(s) have the same
          structure as the main result vector.

        <flag> = INHLIST_TAG_VIRTUAL (2):
          All names in the result are prefixed with a tag: "  " (two spaces)
          for normal inherits, "v " for virtual inherits.

        All flags can be combined with binary-|, just _FLAT and _TREE are
        mutually exclusive.

        If objects, including <ob>, had been undergone a replace_program(),
        the returned filenames will reflect the actual active program.

        The returned names always begin with '/' (absolute path), except
        when the parser runs in COMPAT mode.


EXAMPLES
        Given this inheritance structure:

            / c - d
          a
            \ b

        the efun will give the following results:

          inherit_list(a) -> ({ "a", "c", "b", "d" })
          inherit_list(c) -> ({ "c", "d" })
          inherit_list(a, 1) -> ({ "a", ({ "c", "d" }), "b" })


HISTORY
        Before 3.2.8, the returned names never started with a '/'.
        LDMud 3.2.9/3.3.111 added the tree representation.
        LDMud 3.2.9/3.3.125 added the tagging of virtual inherits.


SEE ALSO
        debug_info(E), include_list(E)
