Faster.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. package Class::Accessor::Faster;
  2. use base 'Class::Accessor';
  3. use strict;
  4. $Class::Accessor::Faster::VERSION = '0.33';
  5. =head1 NAME
  6. Class::Accessor::Faster - Even faster, but less expandable, accessors
  7. =head1 SYNOPSIS
  8.   package Foo;
  9.   use base qw(Class::Accessor::Faster);
  10. =head1 DESCRIPTION
  11. This is a faster but less expandable version of Class::Accessor::Fast.
  12. Class::Accessor's generated accessors require two method calls to accompish
  13. their task (one for the accessor, another for get() or set()).
  14. Class::Accessor::Fast eliminates calling set()/get() and does the access itself,
  15. resulting in a somewhat faster accessor.
  16. Class::Accessor::Faster uses an array reference underneath to be faster.
  17. Read the documentation for Class::Accessor for more info.
  18. =cut
  19. my %slot;
  20. sub _slot {
  21.     my($class, $field) = @_;
  22.     my $n = $slot{$class}->{$field};
  23.     return $n if defined $n;
  24.     $n = keys %{$slot{$class}};
  25.     $slot{$class}->{$field} = $n;
  26.     return $n;
  27. }
  28. sub new {
  29.     my($proto, $fields) = @_;
  30.     my($class) = ref $proto || $proto;
  31.     my $self = bless [], $class;
  32.     $fields = {} unless defined $fields;
  33.     for my $k (keys %$fields) {
  34.         my $n = $class->_slot($k);
  35.         $self->[$n] = $fields->{$k};
  36.     }
  37.     return $self;
  38. }
  39. sub make_accessor {
  40.     my($class, $field) = @_;
  41.     my $n = $class->_slot($field);
  42.     return sub {
  43.         return $_[0]->[$n] if @_ == 1;
  44.         return $_[0]->[$n] = $_[1] if @_ == 2;
  45.         return (shift)->[$n] = @_;
  46.     };
  47. }
  48. sub make_ro_accessor {
  49.     my($class, $field) = @_;
  50.     my $n = $class->_slot($field);
  51.     return sub {
  52.         return $_[0]->[$n] if @_ == 1;
  53.         my $caller = caller;
  54.         $_[0]->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
  55.     };
  56. }
  57. sub make_wo_accessor {
  58.     my($class, $field) = @_;
  59.     my $n = $class->_slot($field);
  60.     return sub {
  61.         if (@_ == 1) {
  62.             my $caller = caller;
  63.             $_[0]->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
  64.         } else {
  65.             return $_[0]->[$n] = $_[1] if @_ == 2;
  66.             return (shift)->[$n] = @_;
  67.         }
  68.     };
  69. }
  70. =head1 AUTHORS
  71. Copyright 2007 Marty Pauley <marty+perl@kasei.com>
  72. This program is free software; you can redistribute it and/or modify it under
  73. the same terms as Perl itself.  That means either (a) the GNU General Public
  74. License or (b) the Artistic License.
  75. =head1 SEE ALSO
  76. L<Class::Accessor>
  77. =cut
  78. 1;