Accessors: 'yes' or 'no'
-
Upload
yaroslav-korshak -
Category
Technology
-
view
1.271 -
download
1
Transcript of Accessors: 'yes' or 'no'
Accessors:
'yes' or 'no'?
?
$obj->foo(1);print $obj->foo;
$obj->{foo} = 1;print $obj->{foo};
package MyPackage;
has 'foo' => 42;
1;
package MyPackage;
sub new { my $class = shift; my $self = bless { @_ }, $class;
$self->{foo} = 42;
return $self;}
1;
package MyPackage;
has 'foo' => 1, is => 'ro';has 'bar' => 1, isa => 'Int';
1;
,
package MyPackage2;use base 'MyPackage';
sub foo { my $self = shift;
croak("It's not int!") if @_ and $_[0] =~ /^\d+$/;
$self->SUPER::foo(@_);}
1;
-
Getter
sub get_foo { my $self = shift; return $self->{foo};}
my $value = $self->get_foo;
Getter
my $value = $self->get_foo;
my $value = $self->{foo};
Setter
sub set_foo { my $self = shift; die 'Not enough arguments for set_foo' unless @_; $self->{foo} = shift; return $self;}
$self->set_foo('bar');
Getter + Setter
sub foo { my $self = shift; return $self->{foo} unless @_; die 'Too much arguments' if @_ > 1; $self->{foo} = shift; return $self;}
my $value = $self->foo;$self->foo('bar');
my $value = $self->foo;$self->foo(1);
my $value = $self->{foo};$self->{foo} = 1;
$self->foo(1); # accessor$self->bar(1); # method
sub bar { my $self = shift;
# ...
return rand($self->{foo});}
Accessors in the Wild
Class::MethodMaker
Object::Tiny
Spiffy
Class::Spiffy
accessors
Object::Tiny
Rubyish::Attribute
Class::Accessor
Class::Accessor::Fast
Class::Accessor::Complex
Class::Accessor::Constructor
Class::Accessor::Classy
Class::Accessor::Lite
Class::XSAccessor
Moose
Mouse
Moo
Mo
M
Boose
Plack::Util::Accessor
Mojo::Base
Rose
XS
Mojo::Base
Mojo::Base::XS
Mojolicious
...
use Mojo::Base::XS -infect;
20%
cpanm Mojo::Base::XS
perl -MMojo::Base::XS=-infect
http://github.com/yko/mojo-base-xs
?
?
Yaroslav 'yko' Korshak
Black Perl 2011
| Internal use only
Mojolicious
Mojo::Base187.94
Mojo::Base::XS238.43
newgetset
Mojo::Base111111120618561769912
Mojo::Base::XS166666776923084761905
Class::XSAccessor95238180000005000000
Direct Access1333333222222228333333