package Foo; sub new{ my ($class, filespec) = @_; # check for existance, other init stuff return bless {file=>$filespec }, $class; } sub sort{ $self = shift; system( 'sort', $self->$filespec, '>', "$self->filespec.sorted" ); return $self->new( "$self->$filespec.sorted" ); } sub munge{ $self = shift; system( 'munge', $self->$filespec, '>', "$self->filespec.munged" ); return $self->new( "$self->$filespec.munged" ); } 1; package main; # Start with a object created by the user. my $data = Foo->new( 'datafile' );; # Munge it two different ways and get two seperate objects back representing the two new states my $sorted = $data->sort(); my $munged = $data->munged(); # Further processing on the new state is invoked directly on the new object my $sorted'n'munged = $sorted->munge(); my $munged'n'sorted = $munged->sort(); # Or even pipeline them my $sorted'n'munged'n'sorted_again = $data->sort()->munge()->sort();