/usr/local/CPAN/DSlib/DS/Target/Proxy.pm
#!perl
# ########################################################################## #
# Title: Data stream target proxy
# Creation date: 2007-04-16
# Author: Michael Zedeler
# Description: Receives data and passes it to another, underlying target
# Data Stream class
# File: $Source: /data/cvs/lib/DSlib/lib/DS/Target/Proxy.pm,v $
# Repository: kronhjorten
# State: $State: Exp $
# Documentation: inline
# Recepient: -
# ########################################################################## #
package DS::Target::Proxy;
use base qw{ DS::Target };
use strict;
use Carp qw{ croak cluck confess carp };
use Carp::Assert;
our ($VERSION) = $DS::VERSION;
our ($REVISION) = '$Revision: 1.1 $' =~ /(\d+\.\d+)/;
my @proxy_methods = qw{ receive_row source attach_source in_type validate_source };
sub new {
my( $class, $inner_object, $delegate ) = @_;
bless my $self = {}, $class;
$self->inner_object( $inner_object ) if $inner_object;
$self->delegate( $delegate ) if $delegate;
return $self;
}
sub inner_object {
my( $self, $object ) = @_;
my $result = 1;
if( $object ) {
assert($object->isa( 'DS::Target' ) );
$self->{inner_object} = $object;
} else {
$result = $self->{inner_object};
}
return $result;
}
sub delegate {
my( $self, $delegate ) = @_;
my $result = 1;
if( $delegate ) {
$self->{delegate} = $delegate;
} else {
$result = $self->{delegate};
}
return $result;
}
# Create all proxy methods using eval
# This is not very expensive, since it is only done once - at load time
foreach my $method ( @proxy_methods ) {
eval <<"END_METHOD"; ## no critic
sub $method {
my( \$self, \@args ) = \@_;
if( \$self->{delegate}->can( 'delegate_$method' ) ) {
return \$self->{delegate}->delegate_invoke( '$method', \$self, \@args );
} else {
return \$self->{inner_object}->$method( \@args );
}
}
END_METHOD
}
1;