On Mon, Oct 12, 2009 at 12:09:26PM -0400, Hans Dieter Pearcey wrote:
> 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.

Alternatively again:

  package RobotArmLike;
  use Moose::Role;
  requires 'draw_with_arm';

  package RobotArm;
  use Moose;
  with 'RobotArmLike';

  sub draw_with_arm { ... }

  package Thing;
  use Moose;

  has robot_arm => (
      is => 'ro',
      does => 'RobotArmLike',
      handles => 'RobotArmLike',
      default => sub { RobotArm->new(to_draw => shift) },
  );

since delegation can delegate to the list of methods provided by a role.

-doy

Reply via email to