Class::Workflow::State::TransitionSet - A state that implements transition meta


Class-Workflow documentation Contained in the Class-Workflow distribution.

Index


Code Index:

NAME

Top

Class::Workflow::State::TransitionSet - A state that implements transition meta data using Set::Object.

SYNOPSIS

Top

	package MyState;
	with "Class::Workflow::State::TransitionSet";

DESCRIPTION

Top

This is a concrete role that implements transitions, has_transition and has_transitions as required by Class::Workflow::State, and adds add_transitions, remove_transitions and clear_transitions as well.

Transition storage is implemented internally with Set::Object.

Unlike Class::Workflow::State::TransitionHash this role does not require transitions to respond to the name method, but as a consequence you must refer to the transitions by value.

Note that you may construct like this:

	Class->new(
		transitions => \@transitions,
	);

and the transition set will be coerced from that array reference.

METHODS

Top

See Class::Workflow::State

has_transition
has_transitions
transitions
add_transitions
transition_set

Class-Workflow documentation Contained in the Class-Workflow distribution.

#!/usr/bin/perl

package Class::Workflow::State::TransitionSet;
use Moose::Role;
use Moose::Util::TypeConstraints;

use Set::Object;

subtype 'Set::Object'
	=> as 'Object'
	=> where { $_[0]->isa("Set::Object") };

coerce "Set::Object"
	=> from 'ArrayRef'
	=> via { Set::Object->new(@{ $_[0] }) };

has transitions => (
	isa      => "Set::Object",
	coerce   => 1,
	accessor => "transition_set",
	default  => sub { Set::Object->new },
);

sub transitions {
	my ( $self, @transitions ) = @_;

	if ( @transitions ) {
		# special case to allow set-as-array-ref
		no warnings 'uninitialized';
		@transitions = @{ $transitions[0] } if @transitions == 1 and ref($transitions[0]) eq "ARRAY";

		$self->transition_set( Set::Object->new( @transitions ) );

		return @transitions;
	} else {
		return $self->transition_set->members;
	}
}

sub clear_transitions {
	my $self = shift;
	$self->transition_set( Set::Object->new );
}

sub remove_transitions {
	my ( $self, @transitions ) = @_;
	$self->transition_set->remove( @transitions );
}

sub add_transitions {
	my ( $self, @transitions ) = @_;
	$self->transition_set->insert( @transitions );
}

sub has_transition {
	my ( $self, $transition ) = @_;
	$self->transition_set->includes( $transition );
}

sub has_transitions {
	my ( $self, @transitions ) = @_;
	$self->transition_set->includes( @transitions );
}

__PACKAGE__;

__END__