[Bioperl-l] Subclassing Bio::Seq ? Extending Bio::Perl

Hilmar Lapp hlapp at gmx.net
Tue Oct 24 14:57:02 EDT 2006


On Oct 24, 2006, at 1:59 PM, JK ((Jesper Agerbo Krogh)) wrote:

>>
>> I think you've generally taken the right path, but see below.
>>
>> First off, object factories are used extensively already but not yet
>> in each and every place where Bioperl creates an object internally.
>> Achieving your goal may entail fixes to Bioperl to use a factory
>> instead of a hard-coded module name. Also be on the lookout for
>> factory() or seq_factory() methods for classes whose work entails
>> creating sequence objects and that already give you control over the
>> type to be created.
>
> Can you elaborate/describe this a bit more?

See for example the POD of Bio::SeqIO (sorry, the method is called  
sequence_factory()).

>
>> The reason that this is a Bio::PrimarySeq and not a Bio::Seq or your
>> extension of the latter is that the Perl garbage collector can't deal
>> with circular references.
>
> Doesn't Scalar::Util::weaken solve that?

You're welcome to test and try. It should be a simple change in  
Bio::Seq::add_SeqFeature(). You will see that it is this method and  
not the feature object that makes sure the wrapped primarySeq gets  
passed as sequence reference. Just change that to creating a new  
reference to the sequence object and make it a weak reference before  
passing it to the feature object.

(The feature object has no requirement (or knowledge) that the  
referenced sequence object is a PrimarySeq.)

>
>> Having said all that, note that if all what you want to do is
>> defining computations on Bio::Seq objects, as opposed to storing
>> values for additional attributes, the best design approach is not to
>> extend the class but to create a class with those computations as
>> static methods (which would accept the seq object on which to compute
>> as an argument; e.g., print $seqComputations->message_digest($seq)).
>
> I could but there are some functionality that I'd by design would  
> like to
> have available on every sequence in the system. This way I would  
> end up
> coding the functionality for getting the message_digest every place  
> that
> I needed to get the value (which would be quite often in this  
> application),
> whereas it by design belongs into the Bio::Seq-stuff.

I'm not following you why this would make any difference (it would be  
$seq->message_digest() compared to $seqCompute->message_digest 
($seq)), unless what you are saying is that you would like to cache  
the result of the computation.

	-hilmar
-- 
===========================================================
: Hilmar Lapp  -:-  Durham, NC  -:-  hlapp at gmx dot net :
===========================================================







More information about the Bioperl-l mailing list