Class-StateMachine-Declarative
view release on metacpan or search on metacpan
lib/Class/StateMachine/Declarative/Builder.pm view on Meta::CPAN
}
$self->$action(@_);
};
$debug and $debug & 32 and _debug(__PACKAGE__, "installing handler for on($event1 => $action) at $class/$name");
Class::StateMachine::install_method($class, $event, $sub, $name);
}
for my $event (@{$state->{ignore}}) {
my $before = "$event/before";
my $event1 = $event;
my $sub = sub {
my $self = shift;
$debug and $debug & 64 and _debug($self, "event $event1 received (ignore)");
my $method = $self->can($before);
$self->$method(@_) if $method;
};
Class::StateMachine::install_method($class, $event, $sub, $name);
}
while (my ($target, $events) = each %{$state->{transitions_rev}}) {
my $target = $self->{states}{$target}{name};
for my $event (@$events) {
my $before = "$event/before";
my $event1 = $event;
my $sub = sub {
my $self = shift;
$debug and $debug & 64 and _debug($self, "event $event1 received (transition target: $target)");
if (my $method = $self->can($before)) {
$self->state_changed_on_call($method, $self, @_) and return;
}
$self->state($target);
};
$debug and $debug & 32 and _debug(__PACKAGE__, "installing handler for transition($event1 => $target) at $class/$name");
Class::StateMachine::install_method($class, $event, $sub, $name);
}
}
$self->_generate_state($_) for @{$state->{substates}};
}
package Class::StateMachine::Declarative::Builder::State;
sub _new {
my ($class, $name, $parent) = @_;
$name //= '';
my $full_name = ($parent ? "$parent->{full_name}/$name" : $name);
my $final_name = $full_name;
$final_name =~ s|^/+||;
my $state = { short_name => $name,
full_name => $full_name,
name => $final_name,
parent => $parent,
substates => [],
transitions => {},
before => {},
on => {},
ignore => [],
delay => [] };
bless $state, $class;
push @{$parent->{substates}}, $state if $parent;
Scalar::Util::weaken($state->{parent});
$state;
}
1;
( run in 0.843 second using v1.01-cache-2.11-cpan-5623c5533a1 )