Class-Mite
view release on metacpan or search on metacpan
lib/Role.pm view on Meta::CPAN
'Role::B';
Composes roles into a class. Can be called as a class method.
=head3 apply_role
Role::apply_role('My::Class', 'Role::Printable');
Role::apply_role($object, 'Role::Serialisable');
Applies a role to a class or object at runtime. Returns true on success.
=head2 Query Methods
=head3 does
if ($object->does('Role::Printable')) {
$object->print;
}
Checks if a class or object consumes a specific role.
=head3 get_applied_roles
my @roles = Role::get_applied_roles('My::Class');
my @roles = Role::get_applied_roles($object);
Returns the list of roles applied to a class.
=head3 is_role
if (Role::is_role('Role::Printable')) {
# It's a role
}
Checks if a package is a role.
=head1 EXAMPLES
=head2 Basic Role with Requirements
package Role::Validator;
use Role;
requires 'validate', 'get_errors';
sub is_valid {
my $self = shift;
return $self->validate && !@{$self->get_errors};
}
1;
=head2 Role with Simple Attributes
package Role::Timestamped;
use Role;
has 'created_at' => ( default => sub { time } );
has 'updated_at' => ( default => sub { time } );
sub update_timestamp {
my $self = shift;
$self->updated_at(time);
}
1;
# Usage in class:
package My::Class;
use Class;
with qw/Role::Timestamped/;
sub new {
my ($class, %args) = @_;
my $self = bless \%args, $class;
$self->created_at(time) unless $self->created_at;
return $self;
}
1;
=head2 Role with Aliasing
package My::Class;
use Class;
# Avoid conflict by aliasing
with
{ role => 'Role::Logger', alias => { log => 'file_log' } },
{ role => 'Role::Debug', alias => { log => 'debug_log' } };
sub log {
my ($self, $message) = @_;
$self->file_log($message);
$self->debug_log($message);
}
1;
=head2 Runtime Role Application
package PluginSystem;
use Role;
sub load_plugin {
my ($self, $plugin_role) = @_;
unless (Role::is_role($plugin_role)) {
die "$plugin_role is not a role";
}
# Apply the plugin role to this instance's class
Role::apply_role($self, $plugin_role);
return $self;
}
1;
=head1 ATTRIBUTE SUPPORT
( run in 1.510 second using v1.01-cache-2.11-cpan-13bb782fe5a )