Re: "handles" accessor not being honoured in constructor?

[email protected] (Stevan Little)
Newsgroups perl.moose
Message-ID <[email protected]>
Ian,

The constructor arguments are not passed on via handles, only the  
attributes themselves are handled in the constructor. You need to  
handle the 'score'  param in the BUILD method manually.

This would however, make a nice MooseX:: module.

- Stevan

On Oct 20, 2008, at 2:27 PM, Ian Sillitoe wrote:

> I'm sure there's probably a simple answer to the following, however  
> I've got
> to the point where I could really do with some advice.
>
> I've abstracted the problem as much as possible to the code appended  
> below.
> The "score" attribute only seems to be set after $c->score( $score )  
> has
> been explicitly called rather than after initialisation through
> MyClass->new( score => $score ).
>
> I get the impression that the issue is probably related, if not the  
> same, as
> one mentioned in a previous post ("bug / feature / idiot user?"
> http://thread.gmane.org/gmane.comp.lang.perl.moose/319/focus=325).  
> i.e. it
> comes down to the sequence of events involved in creating objects and
> registering "handles" (if I understood that correctly). However, if  
> it is
> the same, then I'm afraid I didn't really get what the suggested best
> solution is: should I hack the BUILD process, rethink the way I'm  
> dealing
> with Roles or just RTFM (I think I've done the latter, but I could  
> well be
> wrong...)?
>
> Many thanks in advance,
>
> Ian
>
>
> % cat test.pl
> #!/usr/bin/perl -w
>
> use MyClass;
>
> my $c = MyClass->new( score => '75' );
>                                          # provided by...
> warn $c->score;             # undef       [Role::HasComparisonResult]
> warn $c->normalised_score;  # 0           [MyClass::Result]
>
> $c->score( 75 );
>
> warn $c->score;             # 75          [Role::HasComparisonResult]
> warn $c->normalised_score;  # 0.75        [MyClass::Result]
>
> % cat MyClass.pm
> package MyClass;
>
> use Moose;
> use MyClass::Result;
>
> has 'result' => (
>        is      => 'rw',
>        isa     => 'MyClass::Result',
>        handles => [qw( query match score normalised_score )],
>        default => sub { MyClass::Result->new() },
> );
>
> 1;
>
> % cat MyClass/Result.pm
> package MyClass::Result;
>
> use Moose;
>
> with 'Role::HasComparisonResult';
>
> sub normalised_score { (shift)->score / 100 }
>
> 1;
>
> % cat Role/HasComparisonResult.pm
> package Role::HasComparisonResult;
>
> use Moose::Role;
>
> has 'match' => ( is => 'rw' );
> has 'query' => ( is => 'rw' );
> has 'score' => ( is => 'rw' );
>
> 1;
>
> Directory:
>  test.pl
>  MyClass.pm
>  MyClass/Result.pm
>  Role/HasComparisonResult.pm
>
>
>
>
>
>
>
>
> -- 
> Dr Ian Sillitoe
> CATH Team -- http://cathdb.info
>
> "Advice is what we ask for when we already know
> the answer but wish we didn't" -- Erica Jong
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.