MooX::PDL2 - A Moo based PDL 2.X object


version 0.01


  use Moo;
  extends 'MooX::PDL2';


This class provides the thinnest possible layer required to create a Moo object which is recognized by PDL.

PDL will treat a non-PDL blessed hash as a PDL object if it has a hash element with a key of PDL. That element may be a PDL piddle or a subroutine which returns a piddle.

This class provides a PDL method (which must not be overridden!) which returns the contents of the _PDL attribute. That attribute is yours to manipulate.

Classes without required constructor parameters

PDL does not pass any parameters to a class' initialize method when constructing a new object. Because of this, the default implementation of MooX::PDL2::initialize() returns a bare piddle, not an instance of MooX::PDL2, as it cannot know whether your class requires parameters during construction.

If your class does not require parameters be passed to the constructor, it is safe to overload the initialize method to return a fully fledged instance of your class:

 sub initialize { shift->new() }

Overloaded operators

PDL overloads a number of the standard Perl operators. For the most part it does this using subroutines rather than methods, which makes it difficult to manipulate them. Consider using overload::reify to wrap the overloads in methods, e.g.:

  package MyPDL;
  use Moo;
  extends 'MooX::PDL2';
  use overload::reify;



The actual piddle associated with an object. PDL routines will transparently uses this when passed an object.

This attribute is

  • lazy

  • has a builder which returns PDL->null

  • will coerce its argument to be a piddle

  • has a clearer

See "EXAMPLES" for fun ways of combining it with Moo's facilities.



  # null value
  $pdl = MooX::PDL2->new;


A class representing an evaluated polynomial

This class represents an evaluated polynomial. The polynomial coefficients and the values at which it is evaluated are attributes of the class. When they are changed they trigger a change in the underlying piddle.

Here's the definition:

 package PolyNomial;
 use PDL::Lite;
 use Moo;
 extends 'MooX::PDL2';
 has x => (
     is       => 'rw',
     required => 1,
     trigger  => sub { $_[0]->_clear_PDL },
 has coeffs => (
     is       => 'rw',
     required => 1,
     trigger  => sub { $_[0]->_clear_PDL },
 sub _build__PDL {
     my $self = shift;
     my $x     = $self->x;
     my $coeff = $self->coeffs;
     # this calculation is not robust at all
     my $pdl = $x->ones;
     $pdl *= $coeff->[0];
     for ( my $exp = 1 ; $exp < @$coeff + 1 ; ++$exp ) {
         $pdl += $coeff->[$exp] * $x**$exp;

Note that the attributes use triggers to clear _PDL so that it will be recalculated when it is next accessed through the _PDL attribute accessor.

And here's how to use it

 use PDL::Lite;
 use PolyNomial;
 my $m = PolyNomial->new( coeffs => [ 3, 4 ], x => PDL->sequence(10) );
 print $m, "\n";
 $m *= 2;
 print $m, "\n";
 $m->x( PDL->sequence( 5 ) );
 print $m, "\n";

With sample output:

 [3 7 11 15 19 23 27 31 35 39]
 [6 14 22 30 38 46 54 62 70 78]
 [3 7 11 15 19]


You can make new bug reports, and view existing ones, through the web interface at


Please see those modules/websites for more information related to this module.


Diab Jerius <>


This software is Copyright (c) 2017 by Smithsonian Astrophysical Observatory.

This is free software, licensed under:

  The GNU General Public License, Version 3, June 2007