/usr/local/CPAN/Stem/Stem/Debug.pm
#!/usr/local/bin/perl
package Stem::Debug ;
use strict ;
use Data::Dumper ;
use Scalar::Util qw( openhandle ) ;
use base 'Exporter' ;
our @EXPORT_OK = qw ( dump_data dump_socket dump_owner ) ;
sub dump_data {
my( $data ) = @_ ;
local $Data::Dumper::Sortkeys = \&dump_filter ;
return Dumper $data ;
}
sub dump_filter {
my( $href ) = @_ ;
my @keys ;
my %fh_dumps ;
while( my( $key, $val ) = each %{$href} ) {
if( my $fh_val = dump_socket( $val ) ) {
my $fh_key = "$key.FH" ;
$fh_dumps{$fh_key} = $fh_val ;
push @keys, $fh_key ;
next ;
}
push @keys, $key ;
}
@{$href}{ keys %{fh_dumps} } = values %{fh_dumps} ;
#print "KEYS [@keys]\n" ;
return [ sort @keys ] ;
}
sub dump_socket {
my ( $sock ) = @_ ;
return 'UNDEF' unless defined $sock ;
return 'EMPTY' unless $sock ;
return 'NOT REF' unless ref $sock ;
return 'NOT GLOB' unless $sock =~ /GLOB/ ;
warn "SOCK [$sock]\n" ;
my $fdnum = fileno( $sock ) ;
return 'NO FD' unless defined $fdnum ;
my $opened = openhandle( $sock ) ? 'OPEN' : 'CLOSED' ;
# return "CLOSED $sock" if $opened eq 'CLOSED' ;
# $fdnum = 'NONE' unless defined $fdnum ;
# my $fdnum = "FOO" ;
# return "FD [$fdnum]" unless $sock->isa('IO::Socket') ;
return "FD [$fdnum] *$opened* $sock" ;
}
sub dump_owner {
my ( $owner ) = @_ ;
my $owner_dump = "$owner" ;
while( $owner->{object} ) {
$owner = $owner->{object} ;
$owner_dump .= " -> $owner " ;
}
return $owner_dump ;
}
1 ;