Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister

Re^3: Possible issue with Moose ScalarRef

by tobyink (Abbot)
on Jan 11, 2013 at 15:44 UTC ( #1012906=note: print w/replies, xml ) Need Help??

in reply to Re^2: Possible issue with Moose ScalarRef
in thread Possible issue with Moose ScalarRef

It will work for objects which are internally implemented as hashrefs. Moose does this by default, and it's quite a bit of work to persuade it to implement objects any other way.

(There are various MooseX modules on CPAN that can do that work for you, including MooseX::InsideOut and my own MooseX::ArrayRef which allows you to create Moose classes based on arrayrefs.)

It is generally considered poor style to peek at the hashref internals of Moose objects (indeed, blessed objects in general). One good reason is that if you're relying on a module's internals, it gives the module's author less freedom to refactor those internals.

In this case, when you appear to be the author of both modules, so the above might not be a concern, the strong argument against poking the hashref is that it bypasses type constraint checks.

One alternative solution might be to pass a closure from your first class to your second class...

use strict; use warnings; use Test::More; { package Thing; use Moose; has attr => (is => 'rw'); sub get_closure { my $self = shift; return sub { $self->attr(@_) }; } } { package ThingWithRef; use Moose; has closure => (is => 'ro'); sub translate_to_dutch { my $self = shift; my $str = $self->closure->(); $str =~ s/e/a/; $self->closure->($str); } } my $obj1 = Thing->new(attr => 'Hello'); my $obj2 = ThingWithRef->new(closure => $obj1->get_closure); $obj2->translate_to_dutch; is($obj1->attr, 'Hallo'); done_testing;
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Replies are listed 'Best First'.
Re^4: Possible issue with Moose ScalarRef
by greengaroo (Hermit) on Jan 11, 2013 at 15:52 UTC

    Thanks again! I will think about it and find the best, long-term solution.

    Testing never proves the absence of faults, it only shows their presence.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1012906]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (7)
As of 2018-11-13 22:01 GMT
Find Nodes?
    Voting Booth?
    My code is most likely broken because:

    Results (159 votes). Check out past polls.