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.