9.7 Adding Parameters to a Method

Let's train your animals to eat:

{ package Animal;
  sub named {
    my $class = shift;
    my $name = shift;
    bless \$name, $class;
  sub name {
    my $either = shift;
    ref $either
      ? $$either # it's an instance, return name
      : "an unnamed $either"; # it's a class, return generic
  sub speak {
    my $either = shift;
    print $either->name, " goes ", $either->sound, "\n";
  sub eat {
    my $either = shift;
    my $food = shift;
    print $either->name, " eats $food.\n";
{ package Horse;
  @ISA = qw(Animal);
  sub sound { "neigh" }
{ package Sheep;
  @ISA = qw(Animal);
  sub sound { "baaaah" }

Now try it out:

my $tv_horse = Horse->named("Mr. Ed");

It prints:

Mr. Ed eats hay.
an unnamed Sheep eats grass.

An instance method with parameters gets invoked with the instance, and then the list of parameters. That first invocation is like:

Animal::eat($tv_horse, "hay");

The instance methods form the Application Programming Interface (API) for an object. Most of the effort involved in designing a good object class goes into the API design because the API defines how reusable and maintainable the object and its subclasses will be. Do not rush to freeze an API design before you've considered how the object will be used.