use strict;
use warnings;
use Test::More 'tests' => 4;
package Foo; {
use Object::InsideOut;
sub we_are :Cumulative :Restricted
{
return __PACKAGE__;
}
sub whoami :Chained(bottom up) :Restricted
{
my ($self, $whoami) = @_;
my $class = __PACKAGE__;
return ($whoami) ? "$whoami son of $class" : $class;
}
sub auto : Automethod
{
my $self = $_[0];
my $class = ref($self) || $self;
my $name = $_;
if ($name eq 'izza') {
return (sub {
my $self = $_[0];
my $class = ref($self) || $self;
return ($class . ' isa ' . __PACKAGE__);
}, 'CUM(BOT)');
}
if ($name eq 'bork') {
return (sub {
my $self = $_[0];
my $class = __PACKAGE__;
my ($whoami) = $class->whoami();
return ("$class says 'I am $whoami.'");
}, 'CUM');
}
return;
}
sub as_string :Stringify
{
my ($whoami) = $_[0]->whoami('');
return ("I am $whoami");
}
sub as_hash :Hashify
{
return ($_[0]->we_are());
}
sub as_array :Arrayify
{
return ($_[0]->izza());
}
sub as_code :Codify
{
my $self = $_[0];
return (sub { $self->can('bork')->($self) });
}
}
package Bar; {
use Object::InsideOut 'Foo';
sub we_are :Cumulative :Restricted
{
return __PACKAGE__;
}
sub whoami :Chained(bottom up) :Restricted
{
my ($self, $whoami) = @_;
my $class = __PACKAGE__;
return ($whoami) ? "$whoami son of $class" : $class;
}
sub auto : Automethod
{
my $self = $_[0];
my $class = ref($self) || $self;
my $name = $_;
if ($name eq 'izza') {
return (sub {
my $self = $_[0];
my $class = ref($self) || $self;
return ($class . ' isa ' . __PACKAGE__);
}, 'CUM(BOT)');
}
if ($name eq 'bork') {
return (sub {
my $self = $_[0];
my $class = __PACKAGE__;
my ($whoami) = $class->whoami();
return ("$class says 'I am $whoami.'");
}, 'CUM');
}
return;
}
}
package Baz; {
use Object::InsideOut 'Bar';
sub we_are :Cumulative :Restricted
{
return __PACKAGE__;
}
sub whoami :Chained(bottom up) :Restricted
{
my ($self, $whoami) = @_;
my $class = __PACKAGE__;
return ($whoami) ? "$whoami son of $class" : $class;
}
sub auto : Automethod
{
my $self = $_[0];
my $class = ref($self) || $self;
my $name = $_;
if ($name eq 'izza') {
return (sub {
my $self = $_[0];
my $class = ref($self) || $self;
return ($class . ' isa ' . __PACKAGE__);
}, 'CUM(BOT)');
}
if ($name eq 'bork') {
return (sub {
my $self = $_[0];
my $class = __PACKAGE__;
my ($whoami) = $class->whoami();
return ("$class says 'I am $whoami.'");
}, 'CUM');
}
return;
}
}
package main;
MAIN:
{
my $baz = Baz->new();
is("$baz", 'I am Baz son of Bar son of Foo' => 'whoami');
my %we_are = %{$baz};
is_deeply(\%we_are, { 'Foo' => 'Foo',
'Bar' => 'Bar',
'Baz' => 'Baz' } => 'we_are');
SKIP: {
skip('due to Perl 5.8.0 bug', 2) if ($] == 5.008);
my @izza = @{$baz};
is_deeply(\@izza, [ 'Baz isa Baz',
'Baz isa Bar',
'Baz isa Foo' ] => 'izza');
my @says = @{$baz->()};
is_deeply(\@says, [ "Foo says 'I am Foo.'",
"Bar says 'I am Bar son of Foo.'",
"Baz says 'I am Baz son of Bar son of Foo.'" ] => 'bork');
}
}
exit(0);
# EOF