G'day Moosers,

I'm currently working on some quick lightning talks demonstrating Moose and
why it's useful.  One of the examples I'm using for roles looks like this:

        package SunSmart;

        use Moose::Role;
        use Weather::Google;

        use constant HOT => 28;         # Deg C.

        requires 'go_outside';
        requires 'location';

        before 'go_outside' => sub {
            my ($self) = @_;

            my $weather = Weather::Google->new(
                $self->location
            );

           if ($weather->current->{temp_c} > HOT) {
              print "Don't forget your hat!\n";
           }
        }

In short, if something has a location, and the ability to go_outside, then
we can give it the SunSmart role, and it won't forget its hat if it's too hot.

Unfortunately for me, `location` is an attribute on practically all of my
classes, and Moose doesn't seem to like having an attribute to satisfy a
'requires':

        'SunSmart' requires the method 'location' to be implemented by
        'Person::Social'but the method is only an attribute accessor at
        /usr/lib/perl5/site_perl/5.8/Moose/Meta/Role/Application.pm line 59

This makes me sad, since I really *do* require a location method, but it's
absolutely fine if it's an attribute.

I know there have been some discussions about this in the past, with the
possibility of a 'requires_attr' or similar keyword, although to the best of
my knowledge this is not yet implemented.

In the meantime, is there any easy[1] way to tell Moose that attributes are
just fine to satisify 'requires' dependencies?

Many thanks,

        Paul

[1] Since I'm writing short talks for mixed audiences, I can't show anything
too scary.  Sure, I'm willing to dig around in the guts of all sorts of
things, but I'm trying to dispel the myth that as a regular Perl programmer
you should have to.

-- 
Paul Fenwick <p...@perltraining.com.au> | http://perltraining.com.au/
Director of Training                   | Ph:  +61 3 9354 6001
Perl Training Australia                | Fax: +61 3 9354 2681

Reply via email to