=head1 NAME Cache::IOString - wrapper for IO::String to use in Cache implementations =head1 DESCRIPTION This module implements a derived class of IO::String that handles access modes and allows callback on close. It is for use by Cache implementations and should not be used directly. =cut package Cache::IOString; require 5.006; use strict; use warnings; use IO::String; our @ISA = qw(IO::String); sub open { my $self = shift; my ($dataref, $mode, $close_callback) = @_; return $self->new(@_) unless ref($self); # check mode my $read; my $write; if ($mode =~ /^\+?>>?$/) { $write = 1; $read = 1 if $mode =~ /^\+/; } elsif ($mode =~ /^\+?<$/) { $read = 1; $write = 1 if $mode =~ /^\+/; } $self->SUPER::open($dataref); *$self->{_cache_read} = $read; *$self->{_cache_write} = $write; *$self->{_cache_close_callback} = $close_callback; if ($write) { if ($mode =~ /^\+?>>$/) { # append $self->seek(0, 2); } elsif ($mode =~ /^\+?>$/) { # truncate $self->truncate(0); } } return $self; } sub close { my $self = shift; delete *$self->{_cache_read}; delete *$self->{_cache_write}; *$self->{_cache_close_callback}->($self) if *$self->{_cache_close_callback}; delete *$self->{_cache_close_callback}; $self->SUPER::close(@_); } sub DESTROY { my $self = shift; *$self->{_cache_close_callback}->($self) if *$self->{_cache_close_callback}; } sub pad { my $self = shift; return undef unless *$self->{_cache_write}; return $self->SUPER::pad(@_); } sub getc { my $self = shift; return undef unless *$self->{_cache_read}; return $self->SUPER::getc(@_); } sub ungetc { my $self = shift; return undef unless *$self->{_cache_read}; return $self->SUPER::ungetc(@_); } sub seek { my $self = shift; # call setpos if not writing to ensure a seek past the end doesn't extend # the string. Probably should really return undef in that situation. return $self->SUPER::setpos(@_) unless *$self->{_cache_write}; return $self->SUPER::seek(@_); } sub getline { my $self = shift; return undef unless *$self->{_cache_read}; return $self->SUPER::getline(@_); } sub truncate { my $self = shift; return undef unless *$self->{_cache_write}; return $self->SUPER::truncate(@_); } sub read { my $self = shift; return undef unless *$self->{_cache_read}; return $self->SUPER::read(@_); } sub write { my $self = shift; return undef unless *$self->{_cache_write}; return $self->SUPER::write(@_); } *GETC = \&getc; *READ = \&read; *WRITE = \&write; *SEEK = \&seek; *CLOSE = \&close; 1; __END__ =head1 SEE ALSO Cache::Entry, Cache::File, Cache::RemovalStrategy =head1 AUTHOR Chris Leishman Based on work by DeWitt Clinton =head1 COPYRIGHT Copyright (C) 2003-2006 Chris Leishman. All Rights Reserved. This module is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either expressed or implied. This program is free software; you can redistribute or modify it under the same terms as Perl itself. $Id: IOString.pm,v 1.3 2006/01/31 15:23:58 caleishm Exp $ =cut