markdibley:

A couple things:

Taking those into account, I'd restructure your code into something more like the following (untested, yadda yadda):

#!/usr/bin/perl -w use strict; use Data::Dumper; use sam; use tes; # Create a sample my $sample = new sam("organite"); # Create a new test, name it, add it to the sample and increase it's s +tatus a couple of times my $test1 = new tes("first", $sample); $test1->status("new", "me"); $test1->status("stage one", "me"); # Create ANOTHER new test, name it, add it to the sample and increase +it's status a couple of times my $test2 = new tes("second", $sample); $test2->status("new", "me"); $test2->status("stage one", "me"); # change test2 status $test2->status("stage four", "me"); # change test1 status, but not as high as test2 $test1->status("stage two", "me"); printf("\nSample History (%s)\n%s\n", $sample->sample_id(), $sample->s +tatus_history()); printf("\ntest1 is currently at: %s\n",$test1->current_status()); printf("\ntest2 is currently at: %s\n",$test2->current_status()); printf("\nsample is currently at: %s\n\n",$sample->current_status());

Package sam

package sam; use strict; use Data::Dumper; use status; sub new{ my($class, $name) = @_; my $this = { 'sample_id'=>$name, 'test_list'=>[], 'status'=>[], } ; bless($this, $class); return $this; } sub sample_id{ return $_[0]->{'sample_id'} } sub add_test{ my($this, $test) = @_; # Add test to sample push @{$this->{'test_list'}}, $test; } sub add_status{ my($this, $test) = @_; my $h = {}; $h->{'ref'} = ${$test->{'status'}}[(scalar(@{$test->{'status'}}) - + 1)]; $h->{'src'} = $test; push @{$this->{'status'}}, $h; } sub status_history{ my($this) = @_; my $history = ""; foreach my $entry(@{$this->{'status'}}){ $history .= sprintf("%s\t%s\t%s\t%s\n", $entry->{src}->test_id +(), $entry->{'ref'}->status(), $entry->{'ref'}->time(), $entry->{'ref +'}->owner()); } return $history; } sub current_status{ my($this) = @_; my $top; foreach my $entry(@{$this->{'status'}}){ $top = $entry if(! defined $top || $entry->{'ref'}->status_cod +e() > $top->{'ref'}->status_code()); } return $top->{'ref'}->status; } 1;

Package tes

package tes; use strict; use Data::Dumper; use status; sub new{ my($class, $name, $sample, $data) = @_; my $this = { 'sample'=>$sample, 'test_id'=>$name, 'status'=>[], } ; bless($this, $class); $sample->add_test($this); return $this; } sub test_id{ my($this) = @_; return $this->{'test_id'} } sub status{ my($this, $status, $owner) = @_; if(! defined $status){ return pop @{$this->{'status'}}; } else{ my $stat = new status($status, $owner); push @{$this->{'status'}}, $stat; $this->{'sample'}->add_status($this); } return 1; } sub current_status{ my($this) = @_; my $status = $this->status(); return $status->status(); } 1;

Package status

package status; use strict; use Data::Dumper; my $order = {"new"=>1,"stage one"=>2,"stage two"=>3,"stage four"=>4,"e +nd"=>5}; sub new{ my($class, $status, $owner) = @_; my $this = { 'status'=>$status, 'time'=>time(), 'owner'=>$owner}; bless($this, $class); return $this; } sub status{ my($this, $status) = @_; if(defined $status){ $this->{'status'} = $status; } return $this->{'status'}; } sub status_code{ my($this, $status) = @_; if (exists $order->{$this->{status}}) { return $order->{$this->{'status'}}; } else{ return undef; } } sub time{ my($this) = @_; return $this->{'time'}; } sub owner{ my($this) = @_; return $this->{'owner'}; } 1;

We could do a bit more factoring, etc., but this'll give you an idea of the direction I'd go.

...roboticus

When your only tool is a hammer, all problems look like your thumb.


In reply to Re: Is there a better way to do this? by roboticus
in thread Is there a better way to do this? by markdibley

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.