Thanks. That is exactly what I was looking for. It even works when applying a role during runtime. (This comes quite handy for implementing a dummy backend class which can fake different feature-set. Think something along the line of DBI, where you want to test the DBI class, but not the actual backend like DBD::mysql)
(Moose)
sub BUILD {
my $self = shift;
my $mode = $self->get_mode();
# normally roles are not used/required, but since we manipulate this
# class' roles at runtime we need to require the role
if ($mode =~ /R/xmsi) {
require TLA::Datastore::_readable;
TLA::Datastore::_readable->meta->apply($self);
}
if ($mode =~ /W/xmsi) {
require TLA::Datastore::_writeable;
TLA::Datastore::_writeable->meta->apply($self);
}
if ($mode =~ /X/xmsi) {
require TLA::Datastore::_execute;
TLA::Datastore::_execute->meta->apply($self);
}
return;
}
And later I can test for a specific role:
my $ds = TLA::Datastore::Dummy->new('mode' => 'R');
if ( $ds->DOES('TLA::Datastore::_readable') ) {
# do stuff
};
|