X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMethod%2FGenerate%2FAccessor.pm;h=b01ab0416769fde6bf6ce1ddce1dce33328bf119;hb=64284a1b21ce94c351f555f0e74929e4ff8ad323;hp=ce84f621b4e142b2703f6e756a2a1072061621a8;hpb=b1f04da5b1dd0c5ad2f08fc0509f63ab530fb737;p=gitmo%2FMoo.git diff --git a/lib/Method/Generate/Accessor.pm b/lib/Method/Generate/Accessor.pm index ce84f62..b01ab04 100644 --- a/lib/Method/Generate/Accessor.pm +++ b/lib/Method/Generate/Accessor.pm @@ -23,18 +23,30 @@ sub generate_method { } elsif ($is eq 'rw') { $spec->{accessor} = $name unless exists $spec->{accessor}; } elsif ($is eq 'lazy') { - $spec->{init_arg} = undef unless exists $spec->{init_arg}; $spec->{reader} = $name unless exists $spec->{reader}; $spec->{lazy} = 1; $spec->{builder} ||= '_build_'.$name unless $spec->{default}; + } elsif ($is eq 'rwp') { + $spec->{reader} = $name unless exists $spec->{reader}; + $spec->{writer} = "_set_${name}" unless exists $spec->{writer}; } elsif ($is ne 'bare') { die "Unknown is ${is}"; } + $spec->{builder} = '_build_'.$name if ($spec->{builder}||0) eq 1; + if (($spec->{predicate}||0) eq 1) { + $spec->{predicate} = $name =~ /^_/ ? "_has${name}" : "has_${name}"; + } + if (($spec->{clearer}||0) eq 1) { + $spec->{clearer} = $name =~ /^_/ ? "_clear${name}" : "clear_${name}"; + } + if (($spec->{trigger}||0) eq 1) { + $spec->{trigger} = quote_sub('shift->_trigger_'.$name.'(@_)'); + } my %methods; if (my $reader = $spec->{reader}) { if (our $CAN_HAZ_XS && $self->is_simple_get($name, $spec)) { $methods{$reader} = $self->_generate_xs( - getters => $into, $reader, $name + getters => $into, $reader, $name, $spec ); } else { $self->{captures} = {}; @@ -53,7 +65,7 @@ sub generate_method { && $self->is_simple_set($name, $spec) ) { $methods{$accessor} = $self->_generate_xs( - accessors => $into, $accessor, $name + accessors => $into, $accessor, $name, $spec ); } else { $self->{captures} = {}; @@ -70,7 +82,7 @@ sub generate_method { && $self->is_simple_set($name, $spec) ) { $methods{$writer} = $self->_generate_xs( - setters => $into, $writer, $name + setters => $into, $writer, $name, $spec ); } else { $self->{captures} = {}; @@ -84,13 +96,13 @@ sub generate_method { if (my $pred = $spec->{predicate}) { $methods{$pred} = quote_sub "${into}::${pred}" => - ' '.$self->_generate_simple_has('$_[0]', $name)."\n" + ' '.$self->_generate_simple_has('$_[0]', $name, $spec)."\n" ; } if (my $cl = $spec->{clearer}) { $methods{$cl} = quote_sub "${into}::${cl}" => - " delete \$_[0]->{${\perlstring $name}}\n" + $self->_generate_simple_clear('$_[0]', $name, $spec)."\n" ; } if (my $hspec = $spec->{handles}) { @@ -153,13 +165,13 @@ sub has_eager_default { sub _generate_get { my ($self, $name, $spec) = @_; - my $simple = $self->_generate_simple_get('$_[0]', $name); + my $simple = $self->_generate_simple_get('$_[0]', $name, $spec); if ($self->is_simple_get($name, $spec)) { $simple; } else { 'do { '.$self->_generate_use_default( '$_[0]', $name, $spec, - $self->_generate_simple_has('$_[0]', $name), + $self->_generate_simple_has('$_[0]', $name, $spec), ).'; '.$simple.' }'; } } @@ -169,6 +181,11 @@ sub _generate_simple_has { "exists ${me}->{${\perlstring $name}}"; } +sub _generate_simple_clear { + my ($self, $me, $name) = @_; + " delete ${me}->{${\perlstring $name}}\n" +} + sub generate_get_default { my $self = shift; $self->{captures} = {}; @@ -333,7 +350,7 @@ sub _generate_populate_set { .($spec->{trigger} ? ' ' .$self->_generate_trigger( - $name, $me, $self->_generate_simple_get($me, $name), + $name, $me, $self->_generate_simple_get($me, $name, $spec), $spec->{trigger} )." if ${test};\n" : '' @@ -359,7 +376,7 @@ sub _generate_populate_set { .($spec->{trigger} ? " " .$self->_generate_trigger( - $name, $me, $self->_generate_simple_get($me, $name), + $name, $me, $self->_generate_simple_get($me, $name, $spec), $spec->{trigger} ).";\n" : "" @@ -373,10 +390,16 @@ sub generate_multi_set { "\@{${me}}{qw(${\join ' ', @$to_set})} = $from"; } +sub _generate_core_set { + my ($self, $me, $name, $spec, $value) = @_; + my $name_str = perlstring $name; + "${me}->{${name_str}} = ${value}"; +} + sub _generate_simple_set { my ($self, $me, $name, $spec, $value) = @_; my $name_str = perlstring $name; - my $simple = "${me}->{${name_str}} = ${value}"; + my $simple = $self->_generate_core_set($me, $name, $spec, $value); if ($spec->{weak_ref}) { require Scalar::Util; @@ -439,4 +462,6 @@ sub _generate_xs { $into->can($name); } +sub default_construction_string { '{}' } + 1;