subclassing and role composition for attributes
[gitmo/Moo.git] / lib / Method / Generate / Accessor.pm
CommitLineData
51a3b106 1package Method::Generate::Accessor;
2
3use strictures 1;
4use Class::Tiny::_Utils;
5use base qw(Class::Tiny::Object);
6use Sub::Quote;
7use B 'perlstring';
8
316917c9 9sub generate_method {
6f68f022 10 my ($self, $into, $name, $spec, $quote_opts) = @_;
51a3b106 11 die "Must have an is" unless my $is = $spec->{is};
12 my $name_str = perlstring $name;
13 my $body = do {
14 if ($is eq 'ro') {
316917c9 15 $self->_generate_get($name_str)
51a3b106 16 } elsif ($is eq 'rw') {
316917c9 17 $self->_generate_getset($name_str)
51a3b106 18 } else {
19 die "Unknown is ${is}";
20 }
21 };
6f68f022 22 quote_sub
23 "${into}::${name}" => ' '.$body."\n",
24 (ref($quote_opts) ? ({}, $quote_opts) : ())
25 ;
51a3b106 26}
27
28sub _generate_get {
29 my ($self, $name_str) = @_;
30 "\$_[0]->{${name_str}}";
31}
32
33sub _generate_set {
34 my ($self, $name_str, $value) = @_;
35 "\$_[0]->{${name_str}} = ${value}";
36}
37
38sub _generate_getset {
39 my ($self, $name_str) = @_;
40 q{(@_ > 1 ? }.$self->_generate_set($name_str, q{$_[1]})
41 .' : '.$self->_generate_get($name_str).')';
42}
43
441;