NAME

MooseX::Types::Implements - Require objects to implement a role/interface

VERSION

version 1.103350

SYNOPSIS

package My::Class;

use Moose;
use MooseX::Types::Implements qw( Implements );

has 'vehicle' => (
    is => 'rw',
    isa => Implements[qw( My::Interfaces::Driveable )],
);

has 'pet_animal' => (
    is => 'rw',
    isa => Implements[qw( My::Interfaces::Pet My::Interfaces::Animal )],
);

Interfaces definitions:

package My::Interfaces::Driveable;
use Moose::Role;

requires qw( drive stop );


package My::Interfaces::Pet;
use Moose::Role;

requires qw( play obey );


package My::Interfaces::Animal;
use Moose::Role;

requires qw( eat sleep roam );

Classes:

package My::Car;
use Moose;
with qw( My::Interfaces::Driveable );

sub drive { ... };
sub stop { ... };


package My::Bicycle;
use Moose;
with qw( My::Interfaces::Driveable );

sub drive { ... };
sub stop { ... };


package My::TimeMachine;
use Moose;

sub teleport { ... };


package My::Dog;
use Moose;
with qw( My::Interfaces::Pet My::Interfaces::Animal );

sub play { ... };
sub obey { ... };

sub eat { ... };
sub sleep { ... };
sub roam { ... };


package My::Skunk;
use Moose;
with qw( My::Interfaces::Animal );

sub eat { ... };
sub sleep { ... };
sub roam { ... };

And finally:

package main;

my $class = My::Class->new();

# My::Car and My::Bicycle implement My::Interfaces::Driveable
$class->vehicle( My::Car->new() );
$class->vehicle( My::Bicycle->new() );

# throws error - you cannot drive TimeMachine
$class->vehicle( My::TimeMachine->new() );


# dog is a Pet and an Animal
$class->pet_animal( My::Dog->new() );

# throws error - Skunk is an Animal, but not really a Pet
$class->pet_animal( My::Skunk->new() );

DESCRIPTION

This class provides parameterizable polymorphic type constraint.

TYPES

Implements

# single role
has 'vehicle' => (
    is => 'rw',
    isa => Implements[qw( My::Interfaces::Driveable )],
);

# all roles need to be implemented
has 'pet_animal' => (
    is => 'rw',
    isa => Implements[qw( My::Interfaces::Pet My::Interfaces::Animal )],
);

Implements is a parameterizable type constraint that requires Objects to implement specified roles (automatically loaded).

Subtyping is also supported:

package My::Types;
use MooseX::Types::Implements qw( Implements );
use MooseX::Types -declare => [qw(
    Driveable
)];

subtype Driveable,
    as Implements[qw( My::Interfaces::Driveable )],
    message {
        "Object '$_' needs to implement My::Interfaces::Driveable"
    };

package My::Class;
use Moose;
use My::Types qw( Driveable );

has 'vehicle' => (
    is => 'rw',
    isa => Driveable,
);

SEE ALSO

AUTHOR

Alex J. G. Burzyński <ajgb@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2010 by Alex J. G. Burzyński <ajgb@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.