# TestDBG.pl

require 5.004;

package TestA;

use DBG;

sub new # TestA::new([@argv])
{
	local(@DBG::Flag) = DBG::Entry($_[0]) if ($DBG::On && !$DBG::All);
	if ($DBG::On && $DBG::Flag[0])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), '([@argv])', "\n";
		my $i = 0; foreach (@_) { print $DBG::Stream '  $_[', $i++, "] = '", $_, "'\n"; }
	}
	my $this  = shift(@_);
	my $class = ref($this) || $this;
	my $self  = [];
	bless($self, $class);

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " before Import()\n";
	}

	$self->Import(@_);

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), "  after Import()\n";
	}

	return $self;
}

sub Import # TestA::Import([@argv])
{
	local(@DBG::Flag) = DBG::Entry($_[0]) if ($DBG::On && !$DBG::All);
	if ($DBG::On && $DBG::Flag[0])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), '([@argv])', "\n";
		my $i = 0; foreach (@_) { print $DBG::Stream '  $_[', $i++, "] = '", $_, "'\n"; }
	}
	my $self = shift(@_);

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " flag 1 message\n";
	}

	if ($DBG::On && $DBG::Flag[2])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " flag 2 message\n";
	}

	@{$self} = @_;

	print STDOUT join(' ', @{$self}), "\n";

	return $self;
}

package TestB;

use DBG;
use base qw(TestA);

sub DESTROY # TestB::DESTROY()
{
	local(@DBG::Flag) = DBG::Entry($_[0]) if ($DBG::On && !$DBG::All);
	if ($DBG::On && $DBG::Flag[0])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), '()', "\n";
		my $i = 0; foreach (@_) { print $DBG::Stream '  $_[', $i++, "] = '", $_, "'\n"; }
	}
	my $self = shift(@_);

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " before Export()\n";
	}

	$self->Export();

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), "  after Export()\n";
	}

	return $self;
}

sub Export # TestB::Export()
{
	local(@DBG::Flag) = DBG::Entry($_[0]) if ($DBG::On && !$DBG::All);
	if ($DBG::On && $DBG::Flag[0])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), '()', "\n";
		my $i = 0; foreach (@_) { print $DBG::Stream '  $_[', $i++, "] = '", $_, "'\n"; }
	}
	my $self = shift(@_);

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " flag 1 message\n";
	}

	if ($DBG::On && $DBG::Flag[2])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " flag 2 message\n";
	}

	print STDOUT join(' ', @{$self}), "\n";

	return $self;
}

package main;

use DBG;

MAIN:
{
	local(@DBG::Flag) = DBG::Entry() if ($DBG::On && !$DBG::All);

	if ($DBG::On && $DBG::Flag[1])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), " before TestB->new()\n";
	}

	TestB->new(qw(Hello World));

	if ($DBG::On && $DBG::Flag[2])
	{
		print $DBG::Stream ($DBG::Flag[-1] || DBG::Caller()), "  after TestB->new()\n";
	}
}
