/usr/local/CPAN/DSlib/DS/Transformer/Opaque.pm
#!perl
# ########################################################################## #
# Title: Opaque transformer
# Creation date: 2007-03-05
# Author: Michael Zedeler
# Description: Provides opaque bindings between some internal transformers
# and external transformers
# Data Stream class
# Data transformer
# File: $Source: /data/cvs/lib/DSlib/lib/DS/Transformer/Opaque.pm,v $
# Repository: kronhjorten
# State: $State: Exp $
# Documentation: inline
# Recepient: -
# ########################################################################## #
package DS::Transformer::Opaque;
use base qw{ DS::Transformer };
use strict;
use Carp qw{ confess croak };
use Carp::Assert;
use DS::Source::Push;
use DS::Target::Sub;
our ($VERSION) = $DS::VERSION;
our ($REVISION) = '$Revision: 1.1 $' =~ /(\d+\.\d+)/;
sub source {
my( $self, $source ) = @_;
my $result = $self->SUPER::source( $source );
if( $source ) {
$self->{internal_source} = new DS::Source::Push( $source->out_type )
or confess("Fatal error while trying to create source proxy object.");
$result &&= $self->attach_source_internal( $self->{internal_source} );
}
return $result;
}
sub target {
my( $self, $target ) = @_;
my $result = $self->SUPER::target( $target );
if( $target ) {
$self->{internal_target} = new DS::Target::Sub(
sub {
my( undef, $row ) = @_;
$self->pass_row( $row );
},
$target->in_type
) or confess("Fatal error while trying to create target proxy object.");
$result &&= $self->attach_target_internal( $self->{internal_target} );
}
return $result;
}
sub validate_source {
# In DS::Transformer::Stack validation is done elsewhere.
# Proxies causes validation to happen at two places:
# (1) top-of-stack and target and (2) bottom-of-stack and source
return 1;
}
sub receive_row {
my( $self, $row ) = @_;
assert( $self->{internal_source}, 'Cannot receive rows from undefined source' );
$self->{internal_source}->receive_row( $row );
return;
}
# The following methods are delegated to the internal object
foreach my $internal_method ( qw{ target source } ) {
eval <<"END_METHOD"; ## no critic
sub attach_${internal_method}_internal {
croak("This method must be overridden. You probably want to proxy it to the internal object that needs to be hidden from the outside.");
}
END_METHOD
}
1;