Пожалуйста, не используйте голые имена для файловых дескрипторов.Используйте лексические дескрипторы файлов.
В следующих строках предполагается, что где-то есть хеш %type_handlers
, который выглядит примерно так:
{ const::StreamTypes->STDNET => \&constructor_for_stdnet_handles
, const::StreamTypes->STDWEB => \&constructor_for_stdweb_handles
}
Затем вы можете заменить нижнюю часть вашего конструктора на
my $handler = $type_handlers{ $stream };
my $outstr
= $handler ? $handler->()
: do { my $h; open( $h, '>&', \*::STDOUT ) and $h; }
;
return bless( {
_outStream => $stream
, _outStreamPtr => $outstr
}
, $class
);
Тогда writeLine
становится:
sub writeLine {
my ( $self, $msg ) = @_;
( $self->{_outStreamPtr} || *::STDOUT{IO} )->say( $msg );
}
Этот метод немного более надежен в тех случаях, когда кто-то просто благословляет себя в вашем классе.
my $q_and_d = bless {}, 'output';
Если вы не хотите разрешать «быстрые и грязные» экземпляры и хотите получать более точные сообщения о возможных сбоях, вы можете сделать это:
Carp::croak( 'No outstream!' )
unless my $h = Params::Util::_HANDLE( $self->{_outStreamPtr} )
;