# Connector::Wrapper # # Wrapper class to filter access to a connector by a prefix # # Written by Oliver Welter for the OpenXPKI project 2012 # # TODO: To make this really transparent it need to be inherited # from Connector and implement the prefix stuff package Connector::Wrapper; use strict; use warnings; use English; use Moose; use Data::Dumper; extends 'Connector'; has 'BASECONNECTOR' => ( is => 'ro', required => 1, ); has '+LOCATION' => ( required => 0 ); # Build arrayref from target the first time it is required has _target => ( is => 'rw', isa => 'ArrayRef|Undef', writer => '__target' ); has TARGET => ( is => 'ro', isa => 'Connector::Types::Key|ArrayRef|Undef', trigger => sub { my ($self, $target) = @_; my @target = $self->_build_path( $target ); $self->__target( \@target ); # Force rebuild of prefix $self->PREFIX( $self->PREFIX() ); } ); # override the prefix trigger to prepend the wrapper prefix has '+PREFIX' => ( trigger => sub { my ($self, $prefix, $old_prefix) = @_; if (not $self->TARGET) { $self->log()->debug( 'prefix before target - skipping!' ) ; return; } if (defined $prefix) { my @path = $self->_build_path($prefix); $self->__prefix_path( [ @{$self->_target()}, @path ]); } else { $self->__prefix_path( $self->_target() ); } } ); sub _route_call { my $self = shift; my $call = shift; my $path = shift; my @args = @_; my @fullpath = $self->_build_path_with_prefix( $path ); unshift @args, \@fullpath; return $self->BASECONNECTOR()->$call( @args ); } # Proxy calls sub get { my $self = shift; unshift @_, 'get'; return $self->_route_call( @_ ); } sub get_list { my $self = shift; unshift @_, 'get_list'; return $self->_route_call( @_ ); } sub get_size { my $self = shift; unshift @_, 'get_size'; return $self->_route_call( @_ ); } sub get_hash { my $self = shift; unshift @_, 'get_hash'; return $self->_route_call( @_ ); } sub get_keys { my $self = shift; unshift @_, 'get_keys'; return $self->_route_call( @_ ); } sub set { my $self = shift; unshift @_, 'set'; return $self->_route_call( @_ ); } sub get_meta { my $self = shift; unshift @_, 'get_meta'; return $self->_route_call( @_ ); } sub exists { my $self = shift; unshift @_, 'exists'; return $self->_route_call( @_ ); } no Moose; __PACKAGE__->meta->make_immutable; 1; __END__ =head1 Name Connector =head1 Description This provides a wrapper to the connector with a fixed prefix. =head2 Supported methods get, get_list, get_size, get_hash, get_keys, set, meta