Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there an OO Perl equivalent to an interface?

I know with OO Perl I can have objects and inheritance, but are interfaces implemented? If so, how are they enforced?

like image 319
Pistol Avatar asked Sep 02 '09 11:09

Pistol


2 Answers

You can create a pure virtual class (or role if you are using Moose or MooseX::Declare):

package Foo;

use strict;
use Carp;

sub new  { croak "new not implemented" };
sub do_x { croak "do_x not implemented" };
sub do_y { croak "do_y not implemented" };

But the enforcement will be at run-time. In general, interfaces are needed because the language does not support multiple inheritance and is strictly typed. Perl supports multiple inheritance and (using Moose) something like multiple inheritance (but better) called roles and it is dynamically typed. The strict vs dynamic typing comes down to duck typing (if it quacks() like duck, walks() like a duck, and swims() like a duck, then it is a duck). In Perl, you say:

if ($some_obj->can("quack") {
    $some_obj->quack;
} else {
    croak "incompatible class type: ", ref $some_obj;
}
like image 57
Chas. Owens Avatar answered Oct 08 '22 12:10

Chas. Owens


In traditional Perl OO, very little is enforced. You have the option of $obj->can('methodname') to duck-type what you're using, but there's nothing much like an interface.

(But have a look at Moose, the Roles in there may be what you're after.)

like image 36
ijw Avatar answered Oct 08 '22 11:10

ijw