NAME

Devel::CallerItem - An object representing a function call from the stack of function calls.

SYNOPSIS

Usage:

require Devel::CallerItem;

$call = Devel::CallerItem->from_depth($depth) || return;
$passed_arguments_ref = $call->argument_list_ref();
$callpack = $call->pack();
$callfile = $call->file();
$callline = $call->line();
$callsub = $call->subroutine();
$bool = $call->has_args();
$bool = $call->wants_array();
($arg_ref,@caller) = $call->as_array();
$call_string = $call->as_string($print_level);
$passed_arguments_string = $call->arguments_as_string();

$printable_arg = Devel::CallerItem->printable_arg($arg,$print_level);

DESCRIPTION

Devel::CallerItem objects hold all the information about a specific function call on the stack. The information is basically that obtained from caller and @DB::args, packaged into an object. This comes with some useful methods to print the object in a nice way.

Methods Available:

->from_depth(DEPTH)

This method is the constructor for the class. DEPTH is a number, corresponding to the stack level as used by caller. The following two calls are equivalent in terms of what gets put into '@caller'

@caller = caller($DEPTH);
($arg_ref,@caller) = Devel::CallerItem->from_depth($DEPTH)->as_array();
->argument_list_ref()

Returns a reference to an array holding the elements actually passed to the function on the stack that makes up the function call.

If the function was called as '&func;', then this array is not empty, it holds the array that was passed down to the function 'func'.

->pack()

The package from which the function was called.

->file()

The file from which the function was called.

->line()

The line from which the function was called.

->subroutine()

The fully qualified package name of the function that was called.

->has_args()

Boolean indicating whether the function was called with arguments.

->wants_array()

Boolean indicating the context in which the function was called.

->as_array()

Equivalent to the following:

($call->argument_list_ref(),$call->pack(),$call->file(),
    $call->line(),$call->subroutine(),$call->has_args(),
    $call->wants_array());
->as_string(PRINT_LEVEL)

Returns the object in string format suitable for printing a fully informative message about the function call. Looks like one of the following:

$ = func(args) called from FILE line LINE;
$ = &func called from FILE line LINE;
@ = func(args) called from FILE line LINE;
@ = &func called from FILE line LINE;

giving the context (scalar - $, array - @) and whether it was called with arguments or without (&). PRINT_LEVEL determines the level of detail printed about the arguments to the function - see 'printable_arg' below.

->arguments_as_string(PRINT_LEVEL)

Returns a string representing the arguments held in the argument_list_ref. Equivalent to calling 'printable_arg' for each argument and joining them with commas.

->printable_arg(ARG,PRINT_LEVEL)

Renders ARG printable. PRINT_LEVEL affects the detail of what is printed. There are three levels, 0 or 1 or 2. (Currently anything other than these values is treated as a '2', but this is an unsupported feature an is likely to change if any further levels are added - so use 0/1/2 to be safe.)

Level 0 makes strings printable, but scalars which return refs are just stringified - i.e. an argument which is like [33,{'g' => 55}] would just appear as something like 'ARRAY(0x9882c)'. This is the default.

At level 1, an argument which is like [33,{'g' => 55}] would be fully expanded to '[33,{'g' => 55}]', but any scalar which is repeated in the arguments is just stringified to something like 'ARRAY(0x9882c)'. i.e. if you had '$a = bless [],A;$b =[$a];$a->[0]=$b;', which is a recursive object, then '$a' would be printed as '[[A=ARRAY(0x83038)]]'.

Finally, at the highest level, arguments are printed with an associated variable and bless statement if needed - so with '$a' above you would get $a printed as: '($v1 = bless [($v2 = [$v1])], A)'. NOTE that this does not actually rebuild '$a' in perl code - perl parses this as having $v1 empty in internal array - it is only assigned to after the outer anonymous array is built. This nomenclature is used purely to make explicit any recursive or multiply passed arguments - this sort of level of detail is needed on occasion, but there is a clear cost in clarity.

NOTE that the format of the printed out items that depends on the PRINT_LEVEL is likely to change in future versions when a standardized module for printing variables comes out.

EXAMPLE

The following is a simple example, illustrating the three levels of detail available using the print_level settings, and can be executed using perl -x Devel/CallerItem.pm

#!perl

    require Devel::CallerItem;
    
    $a="pp";
    $c = bless [], A;
    $d = [$c];
    $c->[0] = $d;
    sub level0 {
	print Devel::CallerItem->from_depth(0)->as_string(0),"\n"
    }
    sub level1 {
	print Devel::CallerItem->from_depth(0)->as_string(1),"\n"
    }
    sub level2 {
	print Devel::CallerItem->from_depth(0)->as_string(2),"\n"
    }
    
    level0('hi',21,[44,[66,{"q","hi"},\$a],$c]);
    level1('hi',21,[44,[66,{"q","hi"},\$a],$c]);
    level2('hi',21,[44,[66,{"q","hi"},\$a],$c]);

__END__

AUTHOR

Jack Shirazi (though the difficult bits were taken from sigtrap)

Copyright (c) 1995 Jack Shirazi. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

MODIFICATION HISTORY

Version 1.0, 31st July - JS