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