use VBVar; use strict; # We have b_split return a VBVar object my $x = b_split('john,biran,someone',','); # Use value_of(), with optional arguments, to return # the value of the variable $response->write( $x->value_of(0), $x->value_of(2)); sub b_split { # not fully finished, needs $count and $compare my ($string, $delimiter, $count, $compare) = @_; $delimiter = quotemeta($delimiter); # Passes an array ref to the VBVar constructor, # which then creates the underlying object of the right # kind return VBVar->new([ split(/$delimiter/, $string) ]); } #### package VBVar; use strict; our %VarTypes = ( ARRAY => 'VBVar::Array', SCALAR => 'VBVar::Scalar', HASH => 'VBVar::Hash' ); ## Have our child classes refer to VBVar as needed @VBVar::Array::ISA = ('VBVar'); @VBVar::Scalar::ISA = ('VBVar'); @VBVar::Hash::ISA = ('VBVar'); ## ## Blesses the reference we pass in to the appropriate ## VBVar type. ## sub new { my $type = shift; my $self = shift; bless $self, $VarTypes{ref $self}; } ## Return the value of VBVar if contents are an array sub VBVar::Array::value_of { my $self = shift; my @indices = @_; # If someone passed in a list of indices to return if (@indices) { return $self->[@indices]; } # Otherwise, return the whole array else { return @$self; } } ## Return the value of VBVar if contents are ## a scalar sub VBVar::Scalar::value_of { return ${ $_[0] }; }