--- On Mon, 12/10/09, Jesse Luehrs <d...@tozt.net> wrote:

> From: Jesse Luehrs <d...@tozt.net>

> Yeah, something like this would work:
> 
>   package Thing;
>   use Moose;
>   has robot_arm => (
>       is      => 'ro',
>       isa     => 'RobotArm',
>       default => sub {
>           my $self = shift;
>           return RobotArm->new(to_draw => $self);
>       },
>       handles => { draw_with_arm => 'draw' },
>   );

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.

Mind you, I'm not saying you're wrong.  I think this technique is fine if you 
already have a RobotArm class handling this particular case.  I'm just toying 
more and more with the idea of assembling classes out of role-based components 
(something I'm not pushing for production, of course).  Separation of concerns 
is important, but I want to hear more concrete wins of delegation over role 
composition :)

Cheers,
Ovid
--
Buy the book         - http://www.oreilly.com/catalog/perlhks/
Tech blog            - http://use.perl.org/~Ovid/journal/
Twitter              - http://twitter.com/OvidPerl
Official Perl 6 Wiki - http://www.perlfoundation.org/perl6

Reply via email to