if ($sock->connect(pack_sockaddr_in($rport, $raddr))) { # ${*$sock}{'io_socket_timeout'} = $timeout; return $sock; } #### BEGIN { *CORE::GLOBAL::connect = sub(*$) { my ($socket, $name) = @_; return CORE::connect($socket, $name) if ref($socket) eq 'IO::Socket::Foo'; $_[0] = IO::Socket::Foo->new('perlmonks.org:80') or return undef; return 1; } } package IO::Socket::Foo; use IO::Socket::INET; use base "IO::Socket::INET"; package main; $SIG{PIPE} = sub { die "Broken pipe!\n" }; my $sock = IO::Socket::INET->new('perlmonks.org:80') or die $@; print "\$sock is: $sock\n"; $sock->syswrite("GET / HTTP/1.0\r\n"); $sock->close(); #### if (my $mysock = $sock->connect(pack_sockaddr_in($rport, $raddr))) { print "DEBUG orig glob: $sock\n"; print "DEBUG open glob: $mysock\n"; bless $mysock, ref($sock); print "DEBUG reblessed: $mysock\n\n"; return $mysock; } #### $ ./883113.pl DEBUG orig glob: IO::Socket::Foo=GLOB(0x9929e8) DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8) DEBUG reblessed: IO::Socket::Foo=GLOB(0x9929e8) DEBUG orig glob: IO::Socket::INET=GLOB(0x992688) DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8) DEBUG reblessed: IO::Socket::INET=GLOB(0x9929e8) $sock is: IO::Socket::INET=GLOB(0x9929e8) #### $ ./883113.pl DEBUG orig glob: IO::Socket::Foo=GLOB(0x9929e8) DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8) DEBUG reblessed: IO::Socket::Foo=GLOB(0x9929e8) DEBUG orig glob: IO::Socket::INET=GLOB(0x992688) DEBUG open glob: IO::Socket::Foo=GLOB(0x9929e8) <--- DEBUG reblessed: IO::Socket::INET=GLOB(0x9929e8) | | $sock is: IO::Socket::INET=GLOB(0x992688) <--- != --- Broken pipe!