NAME
MooseX::MultiObject - a class that delegates an interface to a set of objects that do that interface
VERSION
version 0.03
SYNOPSIS
package Role;
use Moose::Role;
requires 'some_method';
package Roles;
use Moose;
use MooseX::MultiObject;
setup_multiobject (
role => 'Role',
);
__PACKAGE__->meta->make_immutable;
my $object = Class::That::Does::Role->new;
my $another_object = Another::Class::That::Does::Role->new;
my @results = map { $_->some_method } ($object, $another_object);
my $both = Roles->new(
objects => [$object, $another_object],
);
my @results = $both->some_methods; # the same result!
does_role($object, 'Role'); # true
does_role($both, 'Role'); # true
DESCRIPTION
Given a role:
package Some::Role;
use Moose::Role;
requires 'foo';
1;
and some classes that do the role:
package Class;
use Moose;
with 'Some::Role';
sub foo { ... }
1;
and something that needs an object that does
Some::Role
:
package Consumer;
use Moose;
has 'some_roller' => (
is => 'ro',
does => 'Some::Role',
requires => 1,
);
sub notify_roller { $self->some_roller->foo( ... ) }
1;
You can say something like:
Consumer->new( some_roller => Class->new )->notify_roller;
And your roller is notified that foo
has occurred. The problem comes when you want two objects to get the message:
Consumer->new( some_roller => [Class->new, Class->new] )->notify_roller;
That fails, because an array cannot does_role('Some::Role')
. That's where MooseX::MultiObject
comes in. It can create an object that works like that array:
package Some::Role::Multi;
use Moose;
use MooseX::MultiObject;
setup_multiobject( role => 'Some::Role' );
__PACKAGE__->meta->make_immutable;
1;
Now you can write:
Consumer->new( some_roller => Some::Role::Multi->new(
objects => [ Class->new, Class->new ],
)->notify_roller;
and it works!
EXPORTS
setup_multiobject( %args )
You can pass setup_multiobject
class => 'ClassName'
instead of role => 'Role'
, and the class's API role will be used as the role to delegate to. (See MooseX::APIRole for information on API roles.)
METHODS
After calling setup_multiobject
, your class becomes able to do the role that you are delegating, and it also becomes able to do MooseX::MultiObject::Role
.
add_managed_object
Add an object to the set of objects that the multiobject delegates to.
get_managed_objects
Return a list of the managed objects.
AUTHOR
Jonathan Rockway <jrockway@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2011 by Jonathan Rockway.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.