cloning and Storable Re: [Bioperl-l] bugs on branch; tests on main trunk

lehvasla at ebi.ac.uk lehvasla at ebi.ac.uk
Sun Sep 14 00:39:03 EDT 2003


This is the best suggestion so far. Bio::Root Clonable it will be.

   -Heikki

> I don't want to see clone() placed in Bio::Root::Root, because as Ewan
> says it
> is not guaranteed to work in all cases, and will probably break at the
> worst
> time.  Also, I tend to use non-hashed implementations such as blessed
> arrayrefs and flyweights that will break generic cloning code that expects
> a
> hashref.  I don't mind seeing it placed into a util class that can be
> multiply-inherited by a subclass that needs the functionality:
>
> 	package Bio::Root::Cloneable;
> 	sub clone {
> 		my $self = shift;
> 		my %copy = %$self;
> 		return bless \%copy,ref $self;
> 	}
>
> 	...
>
> 	package NaiveSubclass;
> 	@ISA = qw(Bio::Root::Root Bio::Root::Cloneable);
>
> 	...
> 	package SomethingElse;
> 	sub do_something_that_needs_cloning {
> 		my $self = shift;
> 		my $obj  = shift;
> 		if ($obj->can('clone')) {
> 		}
> 		else {
> 			$self->throw('passed an unclonable object');
> 		}
> 	}
>
> Lincoln
>
> On Thursday 04 September 2003 03:53 am, Ewan Birney wrote:
>> On Wed, 3 Sep 2003, Heikki Lehvaslaiho wrote:
>> > I've removed the dependency for Storable. Storable is still used if it
>> > is installed. Local code can clone everything except circular
>> > references. If someone knows how to do it, I'd be happy to receive
>> help.
>> > Not having it here does not really matter because the the main use of
>> > the clone method is to allow in-memory creation of a new enzyme based
>> on
>> > an existing one.
>> >
>> > The clone code is written in very general way and should be able to
>> deep
>> > copy any in-memory objects. If you need to add a clone method your own
>> > classes, copy from there. Ewan feels strongly that deep cloning is too
>> > prone to errors to be a general property of bioperl objects, so better
>> > not add this into Bio::Root::Root, although it would be handy.
>>
>> I am willing to be overruled if there are alot of people who agree with
>> Heikki, but clone() methods are, in my view, just promise something (the
>> ability to correctly make a independent copy of all connected objects)
>> without being able to deliver.
>>
>>
>> The problem is with objects that either have eccentric memory layouts
>> (such as bound XS code; not that we have many of these) or have implicit
>> singleton style characteristics (eg, adaptors to databases which have
>> session information). a clone() which naively attempts to just in-memory
>> copy everything with truely fall over on teh first case and probably
>> cause
>> a complex problem on the second case. Remember that these objects may
>> not
>> be the top level ones, but rather be held onto in the object graph.
>>
>>
>> Furthermore, I rarely see the need for clone; in most systems just
>> reference passing is fine, and clone() is at best used as a shorthand
>> for
>> a specific constructor, (which is what it is doing in restriction
>> enzyme)
>> where I would argue the "full memory copy" is really a shorthand for
>> "build me a new RE with precisely the same attributes" which can then be
>> modified.
>>
>>
>> So, I would argue that clone() on RE's is better written as a type of
>> new option
>>
>>   $new_re = new RestrictionEnzyme ( -template => $old_re);
>>
>>
>> and we don't have clone on the Root::Object. Current Heikki is swayed
>> enough by this argument to keep the clone() method specific to RE's.
>>
>>
>> If Jason/Lincoln/Hilmar all (or mostly...) liked clone() on the Root
>> object then I'd have to conceed
>>
>>
>>
>> _______________________________________________
>> Bioperl-l mailing list
>> Bioperl-l at portal.open-bio.org
>> http://portal.open-bio.org/mailman/listinfo/bioperl-l
>
> --
> ========================================================================
> Lincoln D. Stein                           Cold Spring Harbor Laboratory
> lstein at cshl.org			                  Cold Spring Harbor, NY
> ========================================================================
>
>



More information about the Bioperl-l mailing list