Excerpts from Ovid's message of Mon Oct 12 11:53:23 -0400 2009: > So instead of this: > > package Thing; > use Moose; > with ( > DoesRobot => { excludes => 'draw', aliases => { draw => 'draw_with_arm' } > }, > 'DoesDrawable' > ); > > You recommend this: > > package Thing; > use Moose; > has robot_arm => ( > is => 'ro', > isa => 'RobotArm', > default => sub { RobotArm->new({ to_draw => shift }) }, > handles => { draw_with_arm => 'draw' }, > ); > > This is interesting in a couple of ways. Aside from the fact that we have > more scaffolding code we have to write, we no longer get our > composition-time safety from 'requires' which roles provide. With > delegation, if $self doesn't provide the methods you need, you get your > failures at runtime instead of composition time. This is a problem when > delegation requires bi-directional in the sending and receiving > objects.
The fact that a hammer's no good for washing clothes doesn't mean you can't still bash nails with it. package HasRobot; use Moose::Role; requires @some_methods; has robot_arm => ( is => 'ro', isa => 'RobotArm', lazy => 1, default => sub { RobotArm->new({ to_draw => shift }) }, handles => { draw_with_arm => 'draw' }, ); (If you don't like hardcoding draw_with_arm, use MooseX::Role::Parameterized to refactor it.) Alternately, make a RobotArm::Drawable role that just requires @some_methods. hdp.