Besides making this possible (and guaranteeing I won't get into namespace entanglements with superclass members), I really like the idea of genuine encapsulation in perl. Etc. "Inside out". That is freaking brilliant. Somebody deserves a prize for that one.
On behalf of the many people who have worked on refining the idea of inside-out classes, we're extremely glad you're so pleased. And, yes, we actually did get a prize: the ability to do clean encapsulated OO in Perl.
;-)
BTW, if you like the idea of inside-out objects, you're going to love the framework we've build to make them easier to use: Object::InsideOut. Using that framework, your above solution could be written like this:
{ package test;
use Object::InsideOut;
use IO::Socket::INET;
my @socket :Field Handles(IO::Socket::INET)
:Default( _make_socket() );
my @field :Field Arg(field) Get(getField);
sub _make_socket :Private {
return IO::Socket::INET->new(
PeerAddr => '127.0.0.1:80',
Proto => 'tcp',
Blocking => 0
);
}
sub _cleanup :Destroy {
my $self = shift;
print STDERR "Bye from $field[$$self]!\n";
}
}
my $obj = test->new(field => "okay");
print $obj->getField."\n";
print $obj->sockhost."\n";
my $two = test->new(field => "two");
print $two->getField."\n";
I would encourage you to take a look at the module. It may quite literally turn your world inside-out.
Damian