Object::Util

This is a very old article. It has been imported from older blogging software, and the formatting, images, etc may have been lost. Some links may be broken. Some of the information may no longer be correct. Opinions expressed in this article may no longer be held.

I’ve recently released a new module called Object::Util to CPAN. This is a set of handy methods for working with classes and objects in Perl. It is inspired by Safe::Isa, a module which takes advantage of the fact that coderefs may be called as methods on Perl objects:

   my $method = sub { ... };
   $object->$method(@args);

Object::Util gives you a set of coderef utility methods that are applicable to a wide range of classes and objects.

  • $class->$_new(%args) is the same as $class->new(%args) except that it automatically loads $class if it’s not already loaded, and allows $class to be a coderef instead of a class name (in which case it just passes %args to the coderef).

    It is intended for dependency injection, where you have been passed a class or coderef and are expected to use that to generate objects.

  • $object->$_clone() clones an object. It delegates to the object’s clone() method (if it has one), and otherwise tries a bunch of fallback techniques.

    $object->$_clone(%args) clones an object, but passes some extra arguments to the constructor.

  • $class->$_with_traits(@traits) is inspired by MooseX::Traits, but should work equally well with Moose, Mouse, Moo, or Role::Tiny.

  • $object->$_extend(\%methods) is inspired by Object::Extend and prototype-based programming.

  • $_isa, $_can, $_does, $_DOES, and $_call_if_object are stolen from Safe::Isa.

  • $object->$_try($method => @args) will call the method, but catch and ignore any exceptions thrown.

  • $object->$_tap($method => @args) is stolen from Object::Tap.

  • $object->$_dump() dumps the guts of an object.

Although designed to work nicely with Moose, Mouse, Moo, and Class::Tiny, Object::Util doesn’t require any of those. It’s a reasonably light-weight module.