package Cache::Memcached::Managed::Multi; # Make sure we have version info for this module $VERSION = '0.19'; BEGIN { # We're fooling the Kwalitee checker into thinking we're strict use strict; } #-------------------------------------------------------------------------- # No, we're NOT using strict here. There are several reasons, the most # important is that we're doing a lot of nasty stuff here. # If you _do_ want stricture as a developer of this module, simply activate # the line below here #-------------------------------------------------------------------------- #use strict; # At compile time # Create list with method names BEGIN { my @method = qw( add data dead decr delete delete_group delimiter directory errors expiration flush_all flush_interval get get_group get_multi grab_group group group_names inactive incr namespace replace reset servers set start stats stop version ); # Create a method for each of the methods which # Obtains the list of objects # If called in list context # Call the methods in list context and return list of list refs # Elseif called in scalar context # Call the methods in scalar context and return list ref of values # Call the methods in void context eval <$_( \@_ )] } \@{\$objects}; } elsif (defined wantarray) { return [map { scalar \$_->$_( \@_ ) } \@{\$objects}]; } \$_->$_( \@_ ) foreach \@{\$objects}; } #$_ SUB } #BEGIN # Satisfy -require- 1; #--------------------------------------------------------------------------- # # Class methods # #--------------------------------------------------------------------------- # new # # Return instantiated object # # IN: 1 class # 2..N list of Cache::Memcached::Managed (compatible) objects # OUT: 1 instantiated object sub new { my $class = shift; bless \@_,$class } #new #--------------------------------------------------------------------------- # # Object methods # #--------------------------------------------------------------------------- # objects # # IN: 1 instantiated object # OUT: 1..N objects of which this object consists sub objects { @{$_[0]} } #objects #--------------------------------------------------------------------------- __END__ =head1 NAME Cache::Memcached::Managed::Multi - multiple Cache::Memcache::Managed objects =head1 SYNOPSIS use Cache::Memcached::Managed::Multi; my $multi = Cache::Memcached::Managed::Multi->new( @managed ); =head1 DESCRIPTION Provides the same API as L, but applies all methods called to all of the objects specified, except for L and L. =head1 CONTEXT All methods are called on all of the L objects in the same context (list, scalar or void) in which the method is called on the L object. The return value differs in format depending on the context also: =over 2 =item scalar my $listref = $multi->method; print "Result: @{$listref}\n"; When called in scalar context, a list ref with scalar values is returned in the same order in which the objects are used (which is determined by the order in which they were supplied with L and returned by L.. =item list my @listref = $multi->method; print "Result $_: @{$listref[$_]}\n" foreach 0..$#listref; When called in list context, a list of list references is returned in the same order in which the objects are used (which is determined by the order in which they were supplied with L and returned by L. =item void $multi->method; When called in void context, nothing is returned (not strangely enough ;-). =back =head1 SPECIFIC CLASS METHODS There is only one specific class method. =head2 new my $multi = Cache::Memcached::Managed::Multi->new( @managed ); Create an object containing multiple L objects. Returns the instantiated object. =head1 SPECIFIC INSTANCE METHODS =head2 objects my @managed = $multi->objects; Returns the list of instantiated L objects that the object is a proxy for. =head1 AUTHOR Elizabeth Mattijsen =head1 COPYRIGHT (C) 2005 - 2006 BOOKINGS (C) 2007 BOOKING.COM This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =cut