[Maypole] inflating columns to objects

Dave Howorth dhoworth@mrc-lmb.cam.ac.uk
Thu, 21 Oct 2004 17:20:00 +0100


I'm trying to use an object to represent a column. The value is the 
database is a potentially long string (and that is what I want to keep 
in the database :) but when it is displayed, I want to format it into 
lines of a reasonable length. I have written a class (see below) and 
added this line in my driver class:

   QD1::Sequence->has_a(seq => 'my_seq', deflate => 'deflate');

This works when displaying a list, but when I click on edit I get an 
empty space where the textbox should be:

   <p><b>Seq</b>: </p><input TYPE="submit" NAME="edit" VALUE="edit">

What am I doing wrong?

Thanks, Dave
-- 

package my_seq;

# Class to prepare seq column entries for display

use strict;
use warnings;

use overload ( '""'  => \&display );

our $VERSION = '0.01';
my $line_length = 60;

# A blessed array [$value] would be better than the single-element hash
# but HTML::Element can't cope with that :(

sub new
{
  my ($proto, $value) = @_;
  my($class) = ref $proto || $proto;
print STDERR "my_seq::new\n";
  bless {seq=>$value}, $class;
}

sub display
{
  my $self = shift;
print STDERR "my_seq::display\n";
  my $seq  = $self->{seq};
  my $length = length $seq;
  my @result;
  for (my $pos = 0; $pos < $length; $pos += $line_length)
  {
   push @result, substr($seq, $pos, $line_length);
  }

  return join "\n", @result;
}

sub deflate
{
print STDERR "my_seq::deflate()\n";
  return $_[0]->{seq};
}

sub line_length
{
  my $self = shift;
  $line_length = $_[0] if @_ and $_[0] >= 1;
  return $line_length;
}