MooseX::Types::Implements - Require objects to implement a role/interface
version 1.103350
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() );
This class provides parameterizable polymorphic type constraint.
# 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).
Implements
Objects
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, );
MooseX::Types::Parameterizable
MooseX::Types
Alex J. G. Burzyński <ajgb@cpan.org>
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.
To install MooseX::Types::Implements, copy and paste the appropriate command in to your terminal.
cpanm
cpanm MooseX::Types::Implements
CPAN shell
perl -MCPAN -e shell install MooseX::Types::Implements
For more information on module installation, please visit the detailed CPAN module installation guide.