#!/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__ =pod =head1 NAME Class::Workflow::State::TransitionSet - A state that implements transition meta data using Set::Object. =head1 SYNOPSIS package MyState; with "Class::Workflow::State::TransitionSet"; =head1 DESCRIPTION This is a concrete role that implements C, C and C as required by L, and adds C, C and C as well. Transition storage is implemented internally with L. Unlike L this role does not require transitions to respond to the C 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. =head1 METHODS See L =over 4 =item has_transition =item has_transitions =item transitions =item add_transitions =item transition_set =back =cut