Search code examples
perloopmoose

Calling an object method from array of objects in perl using moose


I have one object that has an attribute of an array of another group of objects. I have a toString method that I want to print out the entire contents of the objects. The main goal is to have the Job object call all the post process jobs that are in the array. I want to call the method toString on the objects in the object array as well. Currently, I'm getting this error:

Can't call method "toString" without a package or object reference at JobClass.pm line 52, <JOBFILE> line 5. (which is $item->toString(); in the foreach loop)

Dumper on $item shows the following:

$VAR1 = bless( {
             'ImportID' => '22',
             'ImportTableID' => '1234',
             'ImportTable' => 'testImport'
           }, 'PostJob' );

Main goal of what I'm trying to understand is how I can call a method on an object returned from an member array.

Classes instantiated this way:


    my $postJob = PostJob->new(ImportTable => "testImport",ImportTableID => "1234", ImportID => "22");
    my @postJobs ="";
    push (@postJobs,$postJob);
    $postJob->toString(); #this works fine
    my $job = Job->new(DirectoryName => "testDir",StagingTableName => "stageTable", QBStagingTableID => "5678",postProcessJobs => \@postJobs); 
    $job->toString(); #Breaks with error above

Code is below:


    package PostJob;
    use Moose;
    use strict;
    use Data::Dumper;

    has 'ImportTable' => (isa => 'Str', is => 'rw', required => 1);
    has 'ImportTableID' => (isa => 'Str', is => 'rw', required => 1);
    has 'ImportID' => (isa => 'Str', is => 'rw', required => 1);

    sub toString {
     # Print all the values 
     my $self = shift;;
    print "Table Name for Post Job is ".$self->ImportTable."\n";
    print "Table ID for Post Job is ".$self->ImportTableID."\n";
    print "Import ID for Post Job is ".$self->ImportID."\n";
    }

    package Job;

    use strict;
    use Data::Dumper;
    use Moose;

    has 'DirectoryName' => (isa => 'Str', is => 'rw', required => 1);
    has 'StagingTableName' => (isa => 'Str', is => 'rw', required => 1);
    has 'StagingTableID' => (isa => 'Str', is => 'rw', required => 1);
    has 'postProcessJobs'=> (isa => 'ArrayRef', is => 'rw', required => 0);


    sub addPostJob {
     my ($self,$postJob) = @_;
     push(@{$self->postProcessJobs()},$postJob);

    }

    sub toString 
     {
     # Print all the values.
     my $self = shift;
     print "DUMPING JOB OBJECT CONTENTS*****************************\n";
     print "Directory is ".$self->DirectoryName."\n";
     print "Staging Table is ".$self->StagingTableName."\n";
     print "Staging Table ID is ".$self->StagingTableID."\n";

        print "DUMPING POST JOB CONTENTS*****************************\n";   
        foreach my $item (@{$self->postProcessJobs()})
            {

                $item->toString();
                print Dumper($item);
            }
        print "END DUMPING JOBS*****************************\n";    
    }


    1;


Solution

  • The problem is on the following line:

    my @postJobs ="";
    

    This creates the first member of the array, but this member is not a job, it is an empty string. Replace it with

    my @postJobs;
    

    and the error goes away.