One way to do is is to do the 'has' the supplies the delegated
method before making the requires check, a la:

<code>

  package A::Role;
  use Moose::Role;

  requires qw(a_method);

  package Method::Provider;
  use Moose;

  sub a_method {
    warn "called";
  }

  package A::Class;
  use Moose;

  # 'with' wouldn't work here, because 'has' hasn't happened yet

  has 'an_attribute' => (
    isa     => 'Method::Provider',
    handles => ['a_method'],
    default => sub { Method::Provider->new },
  );

  # It works here because 'with' is just a function that applies the
  # role, which is now in the class (because 'has' installed it!)

  with 'A::Role';

  package main;

  my $foo = A::Class->new;
  $foo->a_method();

</code>

Kind of annoying that it's order-dependant like that, but that's the
way it's implemented. :)

On Mon, Sep 22, 2008 at 03:10:26PM +0100, Andy Armstrong wrote:
> On 22 Sep 2008, at 14:48, Dave Rolsky wrote:
>> Ah, sorry, I missed that part.
>
> Figured :)
>
>> The problem is that attributes cannot satisfy a "requires"  
>> requirement. The requires check happens before the attributes have a  
>> chance to make their methods.
>
>
> I assumed that it was something of that sort. The only thing that  
> confused me was that I thought I had it working - but it seems that / 
> that/ was almost certainly finger trouble.
>
> Anyway, just to reiterate: I'm absolutely loving Moose - thanks all :)
>
> -- 
> Andy Armstrong, Hexten
>
>
>

Reply via email to