On Jul 19, [EMAIL PROTECTED] said:

>Whats the difference between class methods and instance methods on perl ?

Syntactically, nothing.  In fact, if you see

  method $foo @args;

or

  $foo->method(@args);

you can't be sure whether it's a class method or an instance method being
called, since $foo could be an object OR the name of a class.

And they're both defined the same way, as a normal function.

The only REAL difference is that a class method expects its first argument
to be the name of a class, and an instance method expects its first
argument to be an object.

Here's a brief example; you should follow this up with the documentation
already suggested to you.

  package Foo;

  my @instances;

  sub new {
    my $class = shift;
    my $obj = bless { count => scalar(@instances) }, $class;
    push @instances, $obj;
    return $obj;
  }

  sub get_count {
    my $self = shift;
    return $self->{count};
  }

  sub get_instance {
    my ($class, $idx) = @_;
    # we don't really USE $class,
    # so this can be called by objects OR classes
    return $instances[$idx];
  }

  sub all_instances {
    my $class = shift;
    # same here, we don't really NEED the argument we're passed
    return @instances;
  }

This class could be used in the following way:

  use Foo;

  my $first = Foo->new;   # $first's count is 0
  my $second = Foo->new;  # $second's count is 1
  my $third = Foo->new;   # $third's count is 2

  print $second->get_count;  # 1
  print Foo->get_instance(2)->get_count;  # 2, but we already knew that

  # these two return the SAME list of objects
  my @objs = Foo->all_instances;
  my @same = $second->all_instances;

Although I don't see it done often, you can write a function that behaves
different if it receives a class rather than an object:

  sub get_count {
    my $self = shift;

    # if it was $obj->get_count(), return $obj's count
    return $self->{count} if ref $self;

    # otherwise, return the requested object
    return $instances[shift];
  }

The two ways to call this are:

  # returns the object held in $third
  my $specific_instance = Foo->get_count(2);

  # returns 1, the count of $second
  my $c = $second->get_count;

I wouldn't recommend this practice, though, because it can be difficult to
tell what's going on.  I would suggest having separate names of class
methods and instance methods.

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
<stu> what does y/// stand for?  <tenderpuss> why, yansliterate of course.
[  I'm looking for programming work.  If you like my work, let me know.  ]


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to