Skip to content

Instantly share code, notes, and snippets.

@tobyink
Created November 19, 2012 20:46
Show Gist options
  • Select an option

  • Save tobyink/4113759 to your computer and use it in GitHub Desktop.

Select an option

Save tobyink/4113759 to your computer and use it in GitHub Desktop.
use 5.014;
use Test::More;
package Role {
use Moose::Role;
sub xxx { 'xxx' };
}
package Handler {
use Moose;
with qw( Role );
around xxx => sub {
my ($orig, $self, @args) = @_;
return uc( $self->$orig(@args) );
};
}
package Delegator {
use Moose;
has handler => (is => 'ro', does => 'Role', handles => 'Role');
}
package MooseX::DoesBetter {
use Moose::Role;
around DOES => sub {
my ($orig, $self, $role) = @_;
return 1 if $self->$orig($role);
return unless blessed($self);
for my $attr ($self->meta->get_all_attributes) {
next unless $attr->has_handles;
my $handles = $attr->handles;
next if ref $handles;
next unless $attr->has_value($self);
return 1 if $role eq $handles;
return 1 if Class::MOP::class_of($handles)->does_role($role);
}
return;
};
Moose::Util::ensure_all_roles('Moose::Object', __PACKAGE__);
}
ok( Handler->DOES('Role'));
my $handler = Handler->new;
can_ok($handler, 'xxx');
is($handler->xxx, 'XXX');
ok($handler->DOES('Role'));
ok(!Delegator->DOES('Role'));
my $delegator = Delegator->new( handler => $handler );
can_ok($delegator, 'xxx');
is($delegator->xxx, 'XXX');
ok($delegator->DOES('Role'));
done_testing;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment