package MooseX::Emulate::Class::Accessor::Fast;
-use Moose;
+use Moose::Role;
-our $VERSION = 0.0001;
+our $VERSION = '0.00200';
=head1 NAME
=head1 SYNOPSYS
package MyClass;
+ Use Moose;
+
+ with 'MooseX::Emulate::Class::Accessor::Fast';
- use base 'MooseX::Emulate::Class::Accessor::Fast';
- #or
- use Moose;
- extends 'MooseX::Emulate::Class::Accessor::Fast';
#fields with readers and writers
__PACKAGE__->mk_accessors(qw/field1 field2/);
accurately as possible using the Moose attribute system. The public API of
C<Class::Accessor::Fast> is wholly supported, but the private methods are not.
If you are only using the public methods (as you should) migration should be a
-matter of switching your C<use base> line.
+matter of switching your C<use base> line to a C<with> line.
While I have attempted to emulate the behavior of Class::Accessor::Fast as closely
as possible bugs may still be lurking in edge-cases.
=head1 METHODS
+=head2 new %args
+
+Extend the default Moose constructor to emulate the behavior of C::A::F and
+store arguments in the instance hashref.
+
+=cut
+
+around new => sub{
+ my $orig = shift;
+ my $class = shift;
+ my %args;
+ if (scalar @_ == 1 && defined $_[0] && ref($_[0]) eq 'HASH') {
+ %args = %{$_[0]};
+ } else {
+ %args = @_;
+ }
+ my $self = $class->$orig(@_);
+ my @extra = grep { !exists($self->{$_}) } keys %args;
+ @{$self}{@extra} = @args{@extra};
+ return $self;
+};
+
=head2 mk_accessors @field_names
Create read-write accessors. An attribute named C<$field_name> will be created.