[Bioperl-l] Re: code reuse with moose
Siddhartha Basu
sidd.basu at gmail.com
Thu Aug 20 10:03:07 UTC 2009
On Tue, 18 Aug 2009, Chris Fields wrote:
>
> On Aug 18, 2009, at 6:01 AM, Siddhartha Basu wrote:
>
> > Putting it in the bioperl list, makes more sense here,
> >
> > On Wed, 12 Aug 2009, Chris Fields wrote:
> >
> >> (BTW, this is re: the reimplementation of major chunks of BioPerl
> >> using
> >> Moose, Biome: http://github.com/cjfields/biome/tree/)
> >>
> >> Locations should use a Role (specifically, Biome::Role::Range), so
> >> start/end/strand should be attributes, not methods. With attributes
> >> the
> >> best way to do this is probably with a builder, and lazily (start
> >> requires end, and vice versa). Factor out the common code as Tomas
> >> indicates. BTW, the $self->throw() is akin to BioPerl's $self-
> >> >throw()
> >> exception handling; it simply catches any exceptions and passes them
> >> to
> >> the metaclass exception handling.
> >>
> >> I've been thinking about making the Range role abstract for this very
> >> reason (or defining very basic attributes); something like:
> >>
> >> ----------------------------
> >>
> >> package Bio::Role::Range;
> >>
> >> requires qw(_build_start _build_end _build_strand);
> >>
> >> # also require other methods which need to be defined in
> >> implementation
> >>
> >> has 'start' => (
> >> isa => 'Int',
> >> is => 'rw',
> >> builder => '_build_start',
> >> lazy => 1
> >> );
> >>
> >> # same for end, strand (except strand has a different isa via
> >> MooseX::Types)
> >> ....
> >>
> >> package Bio::Location::Foo;
> >>
> >> with 'Bio::Role::Range';
> >>
> >> sub _build_start {
> >> # for location-specific start
> >> }
> >>
> >> sub _build_end {
> >> # for location-specific end
> >> }
> >>
> >> sub _build_strand {
> >> # for location-specific strand
> >> }
> >>
> >> sub _common_build_method {
> >> # factor out common code here, call from other builders
> >> }
> >>
> >> ----------------------------
> >
> > This plan makes things much clearer. Currently the
> > BioMe::Role::Location has a 'requires' keyword and rest of the
> > location modules consume that role to have its own implementation. At
> > this point on BioMe::Location::Atomic has attribute based 'start' and
> > 'end' implememtation. I got a bit confused because in current bioperl
> > 'Bio::Location::Simple' inherits from 'Bio::Location::Atomic' and when
> > i am trying to follow that path in BioMe it has to override that
> > method.
> > So, my question is do all the location modules really needs to
> > inherits
> > from each other. I am totally aware about the origianl design ideas
> > but
> > it would be better to have a flatten hierarchy if possible.
>
> Flattening with roles is always a good idea, yes. I wouldn't worry as
> much about the way it was originally implemented as the general API (and
> ways in which we can simplify it).
Thanks for clarifying that.
>
> > One more thing, what about putting the 'start', 'end' and the other
> > common base attributes in BioMe::Role::Location instead of
> > BioMe::Role::Range. I am not sure which would be correct from bioperl
> > stand of view, just throwing out an idea.
>
> That's a possibility. To me Locations are just Ranges with different
> behavior (hence the below comment...)
>
> >> Also, I think the Coordinate-related stuff should be simplified down
> >> to a
> >> trait or an attribute; they bring in way too much overhead in
> >> bioperl w/o
> >> much added value.
> >
> > You mean instead of having 'builder' method, having a specialized
> > traits handling those. That sounds like even better.
> >
> > -siddhartha
>
> Yes, that's essentially it. Location behavior could be changed by
> having CoordinatePolicy as a trait. Similarly, fuzziness for start/end
> could also be thought of as a trait. In essence, you could probably role
> most behavior into attribute traits (which, in Moose, are just roles that
> are composed into the attribute meta class, Moose::Meta::Attribute). I
> had started up a Biome::Meta::Attribute class in case we were to go down
> this path, then we could start registering specific traits within that
> namespace.
>
> Just to note, it might be easier to try the simplest approach first and
> get tests passing, then layer in traits to see how they act
> performance-wise. My guess is they will speed things up, but you never
> know. Locations will be a performance bottleneck as they are used in
> generic Features.
That's seemed to be a saner approach. Will play around with the builder
approach and get the tests passing at least.
thanks,
-siddhartha
>
> chris
More information about the Bioperl-l
mailing list