+=head2 LimitToQueue
+
+Takes a queue id (numerical) as its only argument. Makes sure that
+Scopes it pulls out apply to this queue (or another that you've selected with
+another call to this method
+
+=cut
+
+sub LimitToQueue {
+ my $self = shift;
+ my $queue = shift;
+ return unless defined $queue;
+
+ my $alias = RT::ObjectScrips->new( $self->CurrentUser )
+ ->JoinTargetToThis( $self );
+ $self->Limit(
+ ALIAS => $alias,
+ FIELD => 'ObjectId',
+ VALUE => int $queue,
+ );
+}
+
+
+=head2 LimitToGlobal
+
+Makes sure that
+Scopes it pulls out apply to all queues (or another that you've selected with
+another call to this method or LimitToQueue
+
+=cut
+
+
+sub LimitToGlobal {
+ my $self = shift;
+ return $self->LimitToQueue(0);
+}
+
+sub LimitToAdded {
+ my $self = shift;
+ return RT::ObjectScrips->new( $self->CurrentUser )
+ ->LimitTargetToAdded( $self => @_ );
+}
+
+sub LimitToNotAdded {
+ my $self = shift;
+ return RT::ObjectScrips->new( $self->CurrentUser )
+ ->LimitTargetToNotAdded( $self => @_ );
+}
+
+sub LimitByStage {
+ my $self = shift;
+ my %args = @_%2? (Stage => @_) : @_;
+ return unless defined $args{'Stage'};
+
+ my $alias = RT::ObjectScrips->new( $self->CurrentUser )
+ ->JoinTargetToThis( $self, %args );
+ $self->Limit(
+ ALIAS => $alias,
+ FIELD => 'Stage',
+ VALUE => $args{'Stage'},
+ );
+}
+
+=head2 LimitByTemplate
+
+Takes a L<RT::Template> object and limits scrips to those that
+use the template.
+
+=cut
+
+sub LimitByTemplate {
+ my $self = shift;
+ my $template = shift;
+
+ $self->Limit( FIELD => 'Template', VALUE => $template->Name );
+
+ if ( $template->Queue ) {
+ # if template is local then we are interested in global and
+ # queue specific scrips
+ $self->LimitToQueue( $template->Queue );
+ $self->LimitToGlobal;
+ }
+ else { # template is global
+
+ # if every queue has a custom version then there
+ # is no scrip that uses the template
+ {
+ my $queues = RT::Queues->new( RT->SystemUser );
+ my $alias = $queues->Join(
+ TYPE => 'LEFT',
+ ALIAS1 => 'main',
+ FIELD1 => 'id',
+ TABLE2 => 'Templates',
+ FIELD2 => 'Queue',
+ );
+ $queues->Limit(
+ LEFTJOIN => $alias,
+ ALIAS => $alias,
+ FIELD => 'Name',
+ VALUE => $template->Name,
+ );
+ $queues->Limit(
+ ALIAS => $alias,
+ FIELD => 'id',
+ OPERATOR => 'IS',
+ VALUE => 'NULL',
+ );
+ return $self->Limit( FIELD => 'id', VALUE => 0 )
+ unless $queues->Count;
+ }
+
+ # otherwise it's either a global scrip or application to
+ # a queue with custom version of the template.
+ my $os_alias = RT::ObjectScrips->new( $self->CurrentUser )
+ ->JoinTargetToThis( $self );
+ my $tmpl_alias = $self->Join(
+ TYPE => 'LEFT',
+ ALIAS1 => $os_alias,
+ FIELD1 => 'ObjectId',
+ TABLE2 => 'Templates',
+ FIELD2 => 'Queue',
+ );
+ $self->Limit(
+ LEFTJOIN => $tmpl_alias, ALIAS => $tmpl_alias, FIELD => 'Name', VALUE => $template->Name,
+ );
+ $self->Limit(
+ LEFTJOIN => $tmpl_alias, ALIAS => $tmpl_alias, FIELD => 'Queue', OPERATOR => '!=', VALUE => 0,
+ );
+
+ $self->_OpenParen('UsedBy');
+ $self->Limit( SUBCLAUSE => 'UsedBy', ALIAS => $os_alias, FIELD => 'ObjectId', VALUE => 0 );
+ $self->Limit(
+ SUBCLAUSE => 'UsedBy',
+ ALIAS => $tmpl_alias,
+ FIELD => 'id',
+ OPERATOR => 'IS',
+ VALUE => 'NULL',
+ );
+ $self->_CloseParen('UsedBy');
+ }
+}
+
+sub ApplySortOrder {
+ my $self = shift;
+ my $order = shift || 'ASC';
+ $self->OrderByCols( {
+ ALIAS => RT::ObjectScrips->new( $self->CurrentUser )
+ ->JoinTargetToThis( $self => @_ )
+ ,
+ FIELD => 'SortOrder',
+ ORDER => $order,
+ } );
+}
+
+=head2 AddRecord
+
+Overrides the collection to ensure that only scrips the user can see are
+returned.
+
+=cut
+
+sub AddRecord {
+ my $self = shift;
+ my ($record) = @_;
+
+ return unless $record->CurrentUserHasRight('ShowScrips');
+ return $self->SUPER::AddRecord( $record );
+}
+
+=head2 Apply
+
+Run through the relevant scrips. Scrips will run in order based on
+description. (Most common use case is to prepend a number to the description,
+forcing the scrips to run in ascending alphanumerical order.)