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

Reply via email to