| MooseX-RelatedClassRoles documentation | Contained in the MooseX-RelatedClassRoles distribution. |
MooseX::RelatedClassRoles - Apply roles to a class related to yours
version 0.004
package My::Class;
use Moose;
has driver_class => (
isa => 'MyApp::Driver',
);
with 'MooseX::RelatedClassRoles' => { name => 'driver' };
# ...
my $obj = My::Class->new(driver_class => "Some::Driver");
$obj->apply_driver_class_roles("Other::Driver::Role");
Frequently, you have to use a class that provides some foo_class accessor or
attribute as a method of dependency injection. Use this role when you'd rather
apply roles to make your custom foo_class instead of manually setting up a
subclass.
A string naming the related class. driver in the SYNOPSIS. Required.
A string naming the related class accessor. driver_class in the
SYNOPSIS. Defaults to appending _class to the name.
A string naming the role applying method. apply_driver_class_names in the
SYNOPSIS. Defaults to adding apply_ and _names to the
class_accessor_name.
Florian Ragwitz (rafl)
Hans Dieter Pearcey <hdp@cpan.org>
This software is copyright (c) 2009 by Hans Dieter Pearcey <hdp@cpan.org>.
This is free software; you can redistribute it and/or modify it under the same terms as perl itself.
| MooseX-RelatedClassRoles documentation | Contained in the MooseX-RelatedClassRoles distribution. |
package MooseX::RelatedClassRoles; our $VERSION = '0.004'; # ABSTRACT: Apply roles to a class related to yours use MooseX::Role::Parameterized; parameter name => ( isa => 'Str', required => 1, ); parameter class_accessor_name => ( isa => 'Str', lazy => 1, default => sub { $_[0]->name . '_class' }, ); parameter apply_method_name => ( isa => 'Str', lazy => 1, default => sub { 'apply_' . $_[0]->class_accessor_name . '_roles' }, ); # This is undocumented because you shouldn't use it unless you really know you # have to. parameter require_class_accessor => ( isa => 'Bool', default => 1, ); role { my $p = shift; my $class_accessor_name = $p->class_accessor_name; my $apply_method_name = $p->apply_method_name; requires $class_accessor_name if $p->require_class_accessor; method $apply_method_name => sub { my $self = shift; my $meta = Moose::Meta::Class->create_anon_class( superclasses => [ $self->$class_accessor_name ], roles => [ @_ ], cache => 1, ); $self->$class_accessor_name($meta->name); }; }; no MooseX::Role::Parameterized; 1;
__END__