The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

MooseX::Role::Parameterized - parameterized roles

VERSION

version 0.02

SYNOPSIS

    package MyRole::Counter;
    use MooseX::Role::Parameterized;

    parameter name => (
        is       => 'ro',
        isa      => 'Str',
        required => 1,
    );

    role {
        my $p = shift;

        my $name = $p->name;

        has $name => (
            is      => 'rw',
            isa     => 'Int',
            default => 0,
        );

        method "increment_$name" => sub {
            my $self = shift;
            $self->$name($self->$name + 1);
        };

        method "decrement_$name" => sub {
            my $self = shift;
            $self->$name($self->$name - 1);
        };
    };

    package MyGame::Tile;
    use Moose;

    with 'MyRole::Counter' => { name => 'stepped_on' };

MooseX::Role::Parameterized::Tutorial

Stop! If you're new here, please read MooseX::Role::Parameterized::Tutorial.

DESCRIPTION

Your parameterized role consists of two things: parameter declarations and a role block.

Parameters are declared using the "parameter" keyword which very much resembles "has" in Moose. You can use any option that "has" in Moose accepts. These parameters will get their values when the consuming class (or role) uses "with" in Moose. A parameter object will be constructed with these values, and passed to the role block.

The role block then uses the usual Moose::Role keywords to build up a role. You can shift off the parameter object to inspect what the consuming class provided as parameters. You can use the parameters to make your role customizable!

There are many paths to parameterized roles (hopefully with a consistent enough API); I believe this to be the easiest and most flexible implementation. Coincidentally, Pugs has a very similar design (I'm not yet convinced that that is a good thing).

CAVEATS

You must use this syntax to declare methods in the role block: method NAME => sub { ... };. This is due to a limitation in Perl. In return though you can use parameters in your methods!

"alias" in Moose::Role and "excludes" in Moose::Role are not yet supported. I'm completely unsure of whether they should be handled by this module. Until we figure out a plan, both declaring and providing a parameter named alias or excludes is an error.

AUTHOR

Shawn M Moore, <sartak@bestpractical.com>

SEE ALSO

MooseX::Role::Matcher