SYNOPSIS
        #include <sys/driver_hooks.h>

        set_driver_hook(H_MODIFY_COMMAND, value)

        <value> being:

          int|string <closure>(string cmd, object player)
          int|string <name>(string cmd)
          <mapping>

DESCRIPTION
        Optional hook to modify commands (both entered or given by a
        call to command()) before the parser sees them (this includes
        special commands like 'status').

        Hook setting can be any closure, the name of the function to
        call in the object, or a mapping.

        For interactives this hook is used only if the interactive
        object has no command modifier already set by the efun
        set_modify_command().

        If the hook is a closure, it is called with the entered
        command as first, and the command giving player as second
        argument. Lambda closures are bound to the command giving player,
        unbound-lambda closures remain unbound.

        If the hook is a string, it is used as the name of an lfun
        in the command giving player, which is called with the command
        as argument.

        If the hook is a mapping, it is queried with the given command
        as index, and the data retrieved is used as new command
        (defaults to 0 if no data is stored for a given command). If
        an entry is a closure instead of a string, it is called as

          int|string <closure>(string cmd, object player)

        and the result from the call is used as 'the' command.

        The result is treated equal in all three cases:
         - If the result is a string, it is the new command to execute
           instead of the given one. Note that it is not possible to
           make several commands from one this way!
         - If the result is a non-zero number, the given command is to
           be ignored. In case of the closure/lfun setting this may
           mean that the closure/lfun already executed it.
         - If the result is 0, the originally given command is to be
           used.

        It is possible for the hook to change the command giver
        (this_player()) for the execution of the command. This means that
        even though the commands are execute for the original commandgiver,
        this_player() will return the changed commandgiver.

HISTORY

SEE ALSO
        hooks(C), command(H), modify_command_fname(H), notify_fail(H),
        send_notify_fail(H)
