1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
package MooseX::Async::Meta::Trait;
use Moose::Role;
use MooseX::Async::Meta::Method::State;
use MooseX::AttributeHelpers;
has events => (
reader => 'get_events',
metaclass => 'Collection::Array',
isa => 'ArrayRef',
auto_deref => 1,
lazy_build => 1,
builder => 'default_events',
provides => { push => 'add_event', }
);
sub default_events {
return [];
}
sub get_state_method_name {
my ( $self, $name ) = @_;
return $name if $self->has_method($name);
return undef;
}
sub add_state_method {
my ( $self, $name, $method ) = @_;
if ( $self->has_method($name) ) {
my $full_name = $self->get_method($name)->fully_qualified_name;
confess
"Cannot add a state method ($name) if a local method ($full_name) is already present";
}
$self->add_event($name);
$self->add_method( $name => $method );
}
after add_role => sub {
my ( $self, $role ) = @_;
if ( $role->isa("MooseX::Async::Meta::Role") ) {
$self->add_event($role->get_events);
}
};
1;
|