SYNOPSIS
        int call_resolved(mixed result, object ob, string func, ...)
        int* call_resolved(mixed* result, object* ob, string func, ...)

DESCRIPTION
        Similar to call_other(). If ob->func() is defined and publicly
        accessible, any of the optional extra arguments are passed to
        ob->func(...). The result of that function call is stored in
        result, which must be passed by reference.

        The efun returns 1 if the function could be called.
        If ob::fun does not define a publicly accessible function, the
        efun will call the H_DEFAULT_METHOD hook if set. If the hook
        is not set or can't resolve the call either, the efun will return 0.
        If the hook is set and can resolve the call, the efun will return -1.

        Calls to the master object never use the H_DEFAULT_METHOD hook.
        To force non-default calls, the efun call_direct_resolved() can
        be used.

        ob can also be an object_name. If a string is passed for ob
        and an object with that name can't be found or loaded, an
        error occurs.

        Additionally the efun accepts an array of objects as <ob>: the
        function is called with the same arguments in all the given objects.
        The single results are collected in two arrays, one for the result
        of the function calls that will be stored in the result parameter,
        and one for the efun result codes that will finally be returned from
        the efun. Array elements can be objects or the names of existing
        objects; destructed objects and 0s will yield a '0' as result in
        both arrays, but don't cause an error.

HISTORY
        LDMud 3.3.113 introduced the H_DEFAULT_METHOD hook.
        LDMud 3.6.2 added array calls.

SEE ALSO
        call_other(E), call_strict(E), call_direct(E), call_direct_strict(E),
        call_direct_resolved(E), create(A), pragma(LPC), extern_call(E),
        function_exists(E), functions(LPC), map_objects(E)
