MXSC must be used by Moose classes, nothing else
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor.pm
CommitLineData
32726d88 1package MooseX::StrictConstructor;
2
3use strict;
4use warnings;
5
2c33a849 6use Moose 0.94 ();
0cdff431 7use Moose::Exporter;
fbfaa61f 8use Moose::Util::MetaRole;
7815dbf4 9
10{
0dc0aea2 11 my %class_meta = ( class => ['MooseX::StrictConstructor::Trait::Class'] );
12
7815dbf4 13
14 if ( $Moose::VERSION < 1.9900 ) {
1a4f7732 15 require MooseX::StrictConstructor::Trait::Method::Constructor;
0dc0aea2 16 $class_meta{constructor}
17 = ['MooseX::StrictConstructor::Trait::Method::Constructor'];
7815dbf4 18 }
19
20 Moose::Exporter->setup_import_methods(
709eccb9 21 class_metaroles => \%class_meta,
7815dbf4 22 );
4a070866 23
24 my $old_import = __PACKAGE__->can('import');
25 no warnings 'redefine';
26 *import = sub {
27 my $caller = caller;
28 Carp::croak "$_[0] can only be applied to Moose classes"
29 unless eval { $caller->meta->isa('Moose::Meta::Class') };
30
31 goto &$old_import;
32 };
7815dbf4 33}
32726d88 34
32726d88 351;
36
5b66b6d4 37# ABSTRACT: Make your object constructors blow up on unknown attributes
38
32726d88 39__END__
40
41=pod
42
32726d88 43=head1 SYNOPSIS
44
2ffa7b60 45 package My::Class;
32726d88 46
f2f2a5dc 47 use Moose;
48 use MooseX::StrictConstructor;
32726d88 49
2ffa7b60 50 has 'size' => ...;
32726d88 51
2ffa7b60 52 # then later ...
53
54 # this blows up because color is not a known attribute
55 My::Class->new( size => 5, color => 'blue' );
32726d88 56
57=head1 DESCRIPTION
58
f2f2a5dc 59Simply loading this module makes your constructors "strict". If your
60constructor is called with an attribute init argument that your class
714128ef 61does not declare, then it calls C<Moose->throw_error()>. This is a great way
f2f2a5dc 62to catch small typos.
2ffa7b60 63
64=head2 Subverting Strictness
65
fbfaa61f 66You may find yourself wanting to have your constructor accept a
67parameter which does not correspond to an attribute.
2ffa7b60 68
fbfaa61f 69In that case, you'll probably also be writing a C<BUILD()> or
70C<BUILDARGS()> method to deal with that parameter. In a C<BUILDARGS()>
71method, you can simply make sure that this parameter is not included
72in the hash reference you return. Otherwise, in a C<BUILD()> method,
73you can delete it from the hash reference of parameters.
2ffa7b60 74
75 sub BUILD {
76 my $self = shift;
77 my $params = shift;
32726d88 78
2ffa7b60 79 if ( delete $params->{do_something} ) {
80 ...
81 }
82 }
32726d88 83
32726d88 84=head1 BUGS
85
2ffa7b60 86Please report any bugs or feature requests to
87C<bug-moosex-strictconstructor@rt.cpan.org>, or through the web
88interface at L<http://rt.cpan.org>. I will be notified, and then
89you'll automatically be notified of progress on your bug as I make
90changes.
32726d88 91
32726d88 92=cut