Re: Subclassing non moose classes

[email protected] ("Mark A. Stratman")
Newsgroups perl.moose
Message-ID <[email protected]>
On Mar 2, 2011, at 9:23 AM, matthew couchman (JIC) wrote:
> I'd like to subclass a non moose class Math::VectorReal so that I can do this

> But its not working, I guess because of the first caveat on the manual page that says that references must be the same between the moose class and the non-moose class.  I'm a bit lost to be honest, could someone point me in the right direction?

The problem is that Math::VectorReal uses an arrayref for its internal structure. It does a bless([] ...), but MooseX::NonMoose likes hashrefs.
I think MooseX::NonMoose::InsideOut should take care of it. Something like this:

package BetterVector;
use Moose;
use MooseX::NonMoose::InsideOut;  # NOTE - different module
use namespace::autoclean;
extends 'Math::VectorReal';

has [qw(x y z)] => (
    isa => 'Num',
    is => 'ro',  # NOTE - 'ro', not 'rw'.... more on this below
);

sub FOREIGNBUILDARGS {
    my ($class, %vals) = @_;
    return map { $vals{$_} } qw(x y z); # NOTE - Math::VR requires args in a specific order, but WE shouldn't.
}

no Moose;

package main;
use Modern::Perl;
my $v = BetterVector->new(x => 1, y => 2, z => 0.5);
say $v->length;

This is a very trimmed proof-of-concept that will compile, and will (at least mostly) work. You'll note I made the x,y,,z accessors read-only. This is because in my limited example, if you change one of those values the calculations won't reflect it.  You'll note the Math::VR api makes the x,y,z accessors read-only and doesn't seem to support changing them.
If you wanted to, you probably can... but you'll have to do a lot of mucking about inside.  Personally, this would prompt to either look for a more suitable vector library, or write a new one. ymmv.

- mark
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.