summaryrefslogtreecommitdiff
path: root/lib/Class/MakeMethods/Emulator/AccessorFast.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Class/MakeMethods/Emulator/AccessorFast.pm')
-rw-r--r--lib/Class/MakeMethods/Emulator/AccessorFast.pm102
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/Class/MakeMethods/Emulator/AccessorFast.pm b/lib/Class/MakeMethods/Emulator/AccessorFast.pm
new file mode 100644
index 0000000..0f47e04
--- /dev/null
+++ b/lib/Class/MakeMethods/Emulator/AccessorFast.pm
@@ -0,0 +1,102 @@
+package Class::MakeMethods::Emulator::AccessorFast;
+
+use strict;
+use Class::MakeMethods::Composite::Hash;
+use Class::MakeMethods::Emulator '-isasubclass';
+
+sub _emulator_target { 'Class::Accessor::Fast' }
+
+sub import {
+ my $class = shift;
+ $class->_handle_namespace( $class->_emulator_target, $_[0] ) and shift;
+}
+
+########################################################################
+
+sub mk_accessors {
+ Class::MakeMethods::Composite::Hash->make(
+ -TargetClass => (shift),
+ 'new' => { name => 'new', modifier => 'with_values' },
+ 'scalar' => [ map {
+ $_,
+ "_${_}_accessor", { 'hash_key' => $_ }
+ } @_ ],
+ );
+}
+
+sub mk_ro_accessors {
+ Class::MakeMethods::Composite::Hash->make(
+ -TargetClass => (shift),
+ 'new' => { name => 'new', modifier => 'with_values' },
+ 'scalar' => [ map {
+ $_, { permit => 'ro' },
+ "_${_}_accessor", { 'hash_key' => $_, permit => 'ro' }
+ } @_ ],
+ );
+}
+
+sub mk_wo_accessors {
+ Class::MakeMethods::Composite::Hash->make(
+ -TargetClass => (shift),
+ 'new' => { name => 'new', modifier => 'with_values' },
+ 'scalar' => [ map {
+ $_, { permit => 'wo' },
+ "_${_}_accessor", { 'hash_key' => $_, permit => 'wo' }
+ } @_ ],
+ );
+}
+
+########################################################################
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Class::MakeMethods::Emulator::AccessorFast - Emulate Class::Accessor::Fast
+
+
+=head1 SYNOPSIS
+
+ package Foo;
+
+ use base qw(Class::MakeMethods::Emulator::AccessorFast);
+ Foo->mk_accessors(qw(this that whatever));
+
+ # Meanwhile, in a nearby piece of code!
+ # Emulator::AccessorFast provides new().
+ my $foo = Foo->new;
+
+ my $whatever = $foo->whatever; # gets $foo->{whatever}
+ $foo->this('likmi'); # sets $foo->{this} = 'likmi'
+
+
+=head1 DESCRIPTION
+
+This module emulates the functionality of Class::Accessor::Fast, using Class::MakeMethods to generate similar methods.
+
+You may use it directly, as shown in the SYNOPSIS above,
+
+Furthermore, you may call C<use Class::MakeMethods::Emulator::AccessorFast
+'-take_namespace';> to alias the Class::Accessor::Fast namespace
+to this package, and subsequent calls to the original package will
+be transparently handled by this emulator. To remove the emulation
+aliasing, call C<use Class::MakeMethods::Emulator::AccessorFast
+'-release_namespace'>.
+
+B<Caution:> This affects B<all> subsequent uses of Class::Accessor::Fast
+in your program, including those in other modules, and might cause
+unexpected effects.
+
+
+=head1 SEE ALSO
+
+See L<Class::MakeMethods> for general information about this distribution.
+
+See L<Class::MakeMethods::Emulator> for more about this family of subclasses.
+
+See L<Class::Accessor::Fast> for documentation of the original module.
+
+=cut