Class::Default(3) Static calls apply to a default instantiation

USING THE MODULES

Class::Default provides a couple of levels of control. They start with simple enabling the method to apply to the default instantation, and move on to providing some level of control over the creation of the default object.

Inheriting from Class::Default

To start, you will need to inherit from Class::Default. You do this in the normal manner, using something like "use base 'Class::Default'", or setting the @ISA value directly. "Class::Default" does not have a default constructor or any public methods, so you should be able to use it a multiple inheritance situation without any implications.

Making method work

To make your class work with Class::Default you need to make a small adjustment to each method that you would like to be able to access the default object.

A typical method will look something like the following

  sub foobar {
      my $self = shift;

      # Do whatever the method does
  }

To make the method work with Class::Default, you should change it to the following

  sub foobar {
      my $self = shift->_self;

      # Do whatever the method does
  }

This change is very low impact, easy to use, and will not make any other differences to the way your code works.

Control over the default object

When needed, Class::Default will make a new instantation of your class and cache it to be used whenever a static call is made. It does this in the simplest way possible, by calling "Class-"new()> with no arguments.

This is fine if you have a very pure class that can handle creating a new object without any arguments, but many classes expect some sort of argument to the the constructor, and indeed that the constructor that should be used it the "new" method.

Enter the "_create_default_object" method. By overloading the "_create_default_object" method in your class, you can custom create the default object. This will used to create the default object on demand, the first time a method is called. For example, the following class demonstrate the use of "_create_default_object" to set some values in the default object.

  package Slashdot::User;

  use base 'Class::Default';

  # Constructor
  sub new {
        my $class = shift;
        my $name = shift;

        my $self = {
                name => $name,
                favourite_color => '',
        };

        return bless $self, $class;
  }

  # Default constructor
  sub _create_default_object {
        my $class = shift;

        my $self = $class->new( 'Anonymous Coward' );
        $self->{favourite_color} = 'Orange';

        return $self;
  }

  sub name {
        $_[0]->_self->{name};
  }

  sub favourite_color {
        $_[0]->_self->{favourite_color};
  }

That provides a statically accessible default object that could be used as in the following manner.

  print "The default slashdot user is " . Slashdot::User->name
      . " and they like the colour " . Slashdot::User->favourite_color;

Remember that the default object is persistant, so changes made to the statically accessible object can be recovered later.

Getting access to the default object

There are a few ways to do this, but the easiest way is to simple do the following

  my $default = Slashdot::User->_get_default;