Begin supporting methods by defining get_method_map and add_method which don't poke...
[gitmo/MooseX-Role-Parameterized.git] / lib / MooseX / Role / Parameterized.pm
CommitLineData
7b42fc96 1#!/usr/bin/env perl
2package MooseX::Role::Parameterized;
a457ed60 3use Moose qw/extends around confess/;
7b42fc96 4use Moose::Role ();
5b82ffb1 5extends 'Moose::Exporter';
7b42fc96 6
d93bd54d 7use MooseX::Role::Parameterized::Meta::Role::Parameterizable;
5b82ffb1 8
a457ed60 9our $CURRENT_METACLASS;
4534bdce 10
5b82ffb1 11__PACKAGE__->setup_import_methods(
a457ed60 12 with_caller => ['parameter', 'role', 'has'],
19af6e75 13);
14
15sub parameter {
16 my $caller = shift;
bd3dd853 17 my $names = shift;
18
19 $names = [$names] if !ref($names);
20
21 for my $name (@$names) {
22 $caller->meta->add_parameter($name, @_);
23 }
19af6e75 24}
7b42fc96 25
5b82ffb1 26sub role {
27 my $caller = shift;
28 my $role_generator = shift;
29 $caller->meta->role_generator($role_generator);
30}
31
7b42fc96 32sub init_meta {
33 my $self = shift;
34
35 return Moose::Role->init_meta(@_,
d93bd54d 36 metaclass => 'MooseX::Role::Parameterized::Meta::Role::Parameterizable',
7b42fc96 37 );
38}
39
5b82ffb1 40# give role a (&) prototype
41around _make_wrapper => sub {
42 my $orig = shift;
43 my ($self, $caller, $sub, $fq_name) = @_;
44
45 if ($fq_name =~ /::role$/) {
46 return sub (&) { $sub->($caller, @_) };
47 }
48
49 return $orig->(@_);
50};
51
a457ed60 52sub has {
53 confess "has must be called within the role { ... } block."
54 unless $CURRENT_METACLASS;
55
56 my $caller = shift;
57 my $names = shift;
58
59 $names = [$names] if !ref($names);
60
61 for my $name (@$names) {
62 $CURRENT_METACLASS->add_attribute($name, @_);
63 }
64}
65
7b42fc96 661;
67