our $AUTOLOAD;
#print "Storable::AUTOLOAD : attempting to run '$AUTOLOAD' (".join(', ', @_).")\n";
my $self = shift @_;
if($AUTOLOAD =~ /::(\w+)$/) {
my $name_to_parse = $1;
my ($AdaptorType, $is_an_id, $foo_id_method_name, $foo_obj_method_name)
unless($AdaptorType) {
throw("Storable::AUTOLOAD : could not parse '$name_to_parse'");
} elsif ($is_an_id) { # $name_to_parse was something like foo_dataflow_rule_id
if(@_) {
$self->{$foo_id_method_name} = shift @_;
if( $self->{$foo_obj_method_name} ) {
# warn "setting $foo_id_method_name in an object that had $foo_obj_method_name defined";
$self->{$foo_obj_method_name} = undef;
}
# attempt to lazy-load:
} elsif( !$self->{$foo_id_method_name} and my $foo_object=$self->{$foo_obj_method_name}) {
$self->{$foo_id_method_name} = $foo_object->dbID;
# warn "Lazy-loaded dbID (".$self->{$foo_id_method_name}.") from $AdaptorType object\n";
}
return $self->{$foo_id_method_name};
} else { # $name_to_parse was something like foo_dataflow_rule
if(@_) { # setter of the object itself
$self->{$foo_obj_method_name} = shift @_;
# attempt to lazy-load:
} elsif( !$self->{$foo_obj_method_name} and my $foo_object_id = $self->{$foo_id_method_name}) {
my $foo_class = 'Bio::EnsEMBL::Hive::'.$AdaptorType;
my $collection = $foo_class->can('collection') && $foo_class->collection();
if( $collection and $self->{$foo_obj_method_name} = $collection->find_one_by('dbID', $foo_object_id) ) { # careful: $AdaptorType may not be unique (aliases)
# warn "Lazy-loading object from $AdaptorType collection\n";
} elsif(my $adaptor = $self->adaptor) {
# warn "Lazy-loading object from $AdaptorType adaptor\n";
$self->{$foo_obj_method_name} = $adaptor->db->get_adaptor( $AdaptorType )->fetch_by_dbID( $foo_object_id );
} else {
# warn "Cannot lazy-load $foo_obj_method_name because the ".ref($self)." is not attached to an adaptor";
}
}
return $self->{$foo_obj_method_name};
} # choice of autoloadable functions
}
}