/usr/local/CPAN/DSlib/DS/Transformer/TabStreamWriter.pm
#!perl
# ########################################################################## #
# Title: Write data stream to tab separated stream
# Creation date: 2007-03-05
# Author: Michael Zedeler
# Description: Writes data stream to a handle (IO::Handle)
# Data Stream class
# Transformer
# File: $Source: /data/cvs/lib/DSlib/lib/DS/Transformer/TabStreamWriter.pm,v $
# Repository: kronhjorten
# State: $State: Exp $
# Documentation: inline
# Recepient: -
# #TODO Must store field order internally. Ask not where to get it from.
# ########################################################################## #
package DS::Transformer::TabStreamWriter;
use base qw{ DS::Transformer::TypePassthrough };
use strict;
use Carp;
use Carp::Assert;
our ($VERSION) = $DS::VERSION;
our ($REVISION) = '$Revision: 1.2 $' =~ /(\d+\.\d+)/;
sub new {
my( $class, $fh, $field_order, $source, $target ) = @_;
my $self = $class->SUPER::new( $source, $target );
assert($fh->isa('IO::Handle'));
$self->{fh} = $fh;
$self->{field_order} = $field_order;
return $self;
}
sub receive_row {
my( $self, $row ) = @_;
# TODO (V3) This needs to be rewritten once a new typing system is in place
# Trying to figure out field order here is just plain ugly and only
# something we do to allow TabFileWriter to work (it needs field order to be
# set before process is called.
unless( $self->{field_order} ) {
$self->{field_order} = [sort keys %$row];
}
return $self->SUPER::receive_row( $row );
}
sub include_header {
my( $self ) = @_;
$self->{include_header} = 1;
return;
}
sub exclude_header {
my( $self ) = @_;
$self->{include_header} = 0;
return;
}
sub process {
my( $self, $row) = @_;
if( $row ) {
if( $self->{include_header} and not $self->{header_included} ) {
$self->write_header;
$self->{header_included} = 1;
}
$self->{fh}->print(join("\t", @$row{@{$self->{field_order}}}), "\r\n");
}
return $row;
}
sub write_header {
my( $self ) = @_;
assert( $self->{field_order} );
$self->{fh}->print(join("\t", @{$self->{field_order}}), "\r\n");
}
1;