#!/usr/bin/perl package Class::Workflow::Transition; use Moose::Role; use Carp qw/croak/; requires "apply"; sub derive_and_accept_instance { my ( $self, $proto_instance, $attrs, @args ) = @_; croak "You must specify the next state of the instance" unless $attrs->{state}; my $state = $attrs->{state}; my $instance = $proto_instance->derive( transition => $self, %$attrs, ); return $state->accept_instance( $instance, @args ); } __PACKAGE__; __END__ =pod =head1 NAME Class::Workflow::Transition - A function over an instance. =head1 SYNOPSIS package MyTransition; use Moose; with 'Class::Workflow::Transition'; =head1 DESCRIPTION This is the base role for transition implementations. B transition object must comply to it's interface, and furthermore must also use the C method to return a derived instance at the end of the operation. =head1 METHODS =over 4 =item derive_and_accept_instance $instance, \%attrs, @args This method calls C<< $instance->derive >> with the attrs, and then calls the instance C on the new instance's state. C<%attrs> B contain the key C, which should do the role L. @args are passed (along with the derived instance) to L. =back =head1 REQUIRED METHODS =over 4 =item apply $insatnce, @args This method accepts a L as it's first argument, and is expected to call C<< $self->derive_and_accept_instance( $instance, \%attrs, @args ) >>, with C<%attrs> containing the state that the instance is being transferred to (it doesn't have to be different than the current state). =back =cut