Role::Tiny - Roles. Like a nouvelle cuisine portion size slice of Moose.

  1. SYNOPSIS
  2. DESCRIPTION
  3. ROLE COMPOSITION
  4. IMPORTED SUBROUTINES
    1. requires
    2. with
    3. before
    4. around
    5. after
    6. Strict and Warnings
  5. SUBROUTINES
    1. does_role
  6. METHODS
    1. apply_roles_to_package
    2. apply_roles_to_object
    3. create_class_with_roles
    4. is_role
  7. CAVEATS
  8. SEE ALSO
  9. AUTHOR
  10. CONTRIBUTORS
  11. COPYRIGHT
  12. LICENSE

SYNOPSIS

package Some::Role;

use Role::Tiny;

sub foo { ... }

sub bar { ... }

around baz => sub { ... };

1;

elsewhere

package Some::Class;

use Role::Tiny::With;

# bar gets imported, but not foo
with 'Some::Role';

sub foo { ... }

# baz is wrapped in the around modifier by Class::Method::Modifiers
sub baz { ... }

1;

If you wanted attributes as well, look at Moo::Role.

DESCRIPTION

Role::Tiny is a minimalist role composition tool.

ROLE COMPOSITION

Role composition can be thought of as much more clever and meaningful multiple inheritance. The basics of this implementation of roles is:

Unlike Class::C3, where the last class inherited from "wins," role composition is the other way around, where the class wins. If multiple roles are applied in a single call (single with statement), then if any of their provided methods clash, an exception is raised unless the class provides a method since this conflict indicates a potential problem.

IMPORTED SUBROUTINES

requires

requires qw(foo bar);

Declares a list of methods that must be defined to compose role.

with

with 'Some::Role1';

with 'Some::Role1', 'Some::Role2';

Composes another role into the current role (or class via Role::Tiny::With).

If you have conflicts and want to resolve them in favour of Some::Role1 you can instead write:

with 'Some::Role1';
with 'Some::Role2';

If you have conflicts and want to resolve different conflicts in favour of different roles, please refactor your codebase.

before

before foo => sub { ... };

See "before method(s) => sub { ... }" in Class::Method::Modifiers for full documentation.

Note that since you are not required to use method modifiers, Class::Method::Modifiers is lazily loaded and we do not declare it as a dependency. If your Role::Tiny role uses modifiers you must depend on both Class::Method::Modifiers and Role::Tiny.

around

around foo => sub { ... };

See "around method(s) => sub { ... }" in Class::Method::Modifiers for full documentation.

Note that since you are not required to use method modifiers, Class::Method::Modifiers is lazily loaded and we do not declare it as a dependency. If your Role::Tiny role uses modifiers you must depend on both Class::Method::Modifiers and Role::Tiny.

after

after foo => sub { ... };

See "after method(s) => sub { ... }" in Class::Method::Modifiers for full documentation.

Note that since you are not required to use method modifiers, Class::Method::Modifiers is lazily loaded and we do not declare it as a dependency. If your Role::Tiny role uses modifiers you must depend on both Class::Method::Modifiers and Role::Tiny.

Strict and Warnings

In addition to importing subroutines, using Role::Tiny applies strict and warnings to the caller.

SUBROUTINES

does_role

if (Role::Tiny::does_role($foo, 'Some::Role')) {
  ...
}

Returns true if class has been composed with role.

This subroutine is also installed as ->does on any class a Role::Tiny is composed into unless that class already has an ->does method, so

if ($foo->does('Some::Role')) {
  ...
}

will work for classes but to test a role, one must use ::does_role directly.

Additionally, Role::Tiny will override the standard Perl DOES method for your class. However, if any class in your class' inheritance hierarchy provides DOES, then Role::Tiny will not override it.

METHODS

apply_roles_to_package

Role::Tiny->apply_roles_to_package(
  'Some::Package', 'Some::Role', 'Some::Other::Role'
);

Composes role with package. See also Role::Tiny::With.

apply_roles_to_object

Role::Tiny->apply_roles_to_object($foo, qw(Some::Role1 Some::Role2));

Composes roles in order into object directly. Object is reblessed into the resulting class. Note that the object's methods get overridden by the role's ones with the same names.

create_class_with_roles

Role::Tiny->create_class_with_roles('Some::Base', qw(Some::Role1 Some::Role2));

Creates a new class based on base, with the roles composed into it in order. New class is returned.

is_role

Role::Tiny->is_role('Some::Role1')

Returns true if the given package is a role.

CAVEATS

SEE ALSO

Role::Tiny is the attribute-less subset of Moo::Role; Moo::Role is a meta-protocol-less subset of the king of role systems, Moose::Role.

Ovid's Role::Basic provides roles with a similar scope, but without method modifiers, and having some extra usage restrictions.

AUTHOR

mst - Matt S. Trout (cpan:MSTROUT) <[email protected]>

CONTRIBUTORS

dg - David Leadbeater (cpan:DGL) <[email protected]>

frew - Arthur Axel "fREW" Schmidt (cpan:FREW) <[email protected]>

hobbs - Andrew Rodland (cpan:ARODLAND) <[email protected]>

jnap - John Napiorkowski (cpan:JJNAPIORK) <[email protected]>

ribasushi - Peter Rabbitson (cpan:RIBASUSHI) <[email protected]>

chip - Chip Salzenberg (cpan:CHIPS) <[email protected]>

ajgb - Alex J. G. Burzyński (cpan:AJGB) <[email protected]>

doy - Jesse Luehrs (cpan:DOY) <doy at tozt dot net>

perigrin - Chris Prather (cpan:PERIGRIN) <[email protected]>

Mithaldu - Christian Walde (cpan:MITHALDU) <[email protected]>

ilmari - Dagfinn Ilmari Mannsåker (cpan:ILMARI) <[email protected]>

tobyink - Toby Inkster (cpan:TOBYINK) <[email protected]>

haarg - Graham Knop (cpan:HAARG) <[email protected]>

Copyright (c) 2010-2012 the Role::Tiny "AUTHOR" and "CONTRIBUTORS" as listed above.

LICENSE

This library is free software and may be distributed under the same terms as perl itself.