The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Webservice::InterMine::Query::Roles::Templateable;

use Moose::Role;

requires qw(all_constraints);
use Webservice::InterMine::Query::Template;
use Webservice::InterMine::TemplateConstraintFactory;
use Webservice::InterMine::Query::TemplateHandler;

=head2 to_template

Converts a query to a new template query. When converting
from a non-template, all constraints will be set to 'editable' 
and 'locked' (the default values).

=cut 

sub to_template {
    my $self  = shift;
    my %attr = %$self;
    $attr{constraint_factory} 
        = Webservice::InterMine::TemplateConstraintFactory->new;
    $attr{handler}
        = Webservice::InterMine::Query::TemplateHandler->new;
    my $clone = bless {%attr}, 'Webservice::InterMine::Query::Template';
    $clone->{constraints} = [];
    $clone->suspend_validation;
    for my $con ($self->all_constraints) {
        my %args = %$con;
        $clone->add_constraint(%$con);
    }
    $clone->resume_validation;
    return $clone;
}

1;