| MooseX-StrictConstructor documentation | Contained in the MooseX-StrictConstructor distribution. |
MooseX::StrictConstructor::Trait::Class - A role to make immutable constructors strict
version 0.16
This role simply wraps _inline_BUILDALL() (from
Moose::Meta::Class) so that immutable classes have a
strict constructor.
Dave Rolsky <autarch@urth.org>
This software is Copyright (c) 2011 by Dave Rolsky.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)
| MooseX-StrictConstructor documentation | Contained in the MooseX-StrictConstructor distribution. |
package MooseX::StrictConstructor::Trait::Class; BEGIN { $MooseX::StrictConstructor::Trait::Class::VERSION = '0.16'; } use Moose::Role; use namespace::autoclean; use B (); around new_object => sub { my $orig = shift; my $self = shift; my $params = @_ == 1 ? $_[0] : {@_}; my $instance = $self->$orig(@_); my %attrs = ( __INSTANCE__ => 1, ( map { $_ => 1 } grep {defined} map { $_->init_arg() } $self->get_all_attributes() ) ); my @bad = sort grep { !$attrs{$_} } keys %$params; if (@bad) { $self->throw_error( "Found unknown attribute(s) init_arg passed to the constructor: @bad" ); } return $instance; }; around '_inline_BUILDALL' => sub { my $orig = shift; my $self = shift; my @source = $self->$orig(); my @attrs = ( '__INSTANCE__ => 1,', map { B::perlstring($_) . ' => 1,' } grep {defined} map { $_->init_arg() } $self->get_all_attributes() ); return ( @source, 'my %attrs = (' . ( join ' ', @attrs ) . ');', 'my @bad = sort grep { !$attrs{$_} } keys %{ $params };', 'if (@bad) {', 'Moose->throw_error("Found unknown attribute(s) passed to the constructor: @bad");', '}', ); } if $Moose::VERSION >= 1.9900; 1; # ABSTRACT: A role to make immutable constructors strict
__END__