views:

184

answers:

3

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

+11  A: 

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.)

ijw
+1 for Moose with Roles. Especially if you're coming from a strict OO background/preference, it does what you like.
Kyle Walsh
http://stackoverflow.com/questions/1341903/c-like-usage-of-moose-with-perl-for-oop
draegtun
+15  A: 

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;
}
Chas. Owens
+9  A: 

But of course! Class::Interface.

That said, I'd look at Moose first. It is fantastic.

Dave Pirotte
Yeah, right, CPAN has everything. ;-)
ijw