package Data::MultiValued::AttributeAccessors; use strict; use warnings; use base 'Moose::Meta::Method::Accessor'; use Carp 'confess'; # ABSTRACT: method meta-class for multi-valued attribute accessors =head1 DESCRIPTION Subclass of L, generates non-inlined (patches welcome) accessors for multi-valued attributes. =method C<_instance_is_inlinable> Returns C<0> to prevent attempts to inline the accessor methods. =cut sub _instance_is_inlinable { 0 } =method C<_generate_accessor_method> =method C<_generate_reader_method> =method C<_generate_writer_method> =method C<_generate_predicate_method> =method C<_generate_clearer_method> Delegate to C, C, C, C, passing empty options (i.e. no tags, no ranges). =cut sub _generate_accessor_method { my $self = shift; my $attr = $self->associated_attribute; return sub { if (@_ >= 2) { $attr->set_multi_value($_[0], {}, $_[1]); } $attr->get_multi_value($_[0], {}); } } sub _generate_reader_method { my $self = shift; my $attr = $self->associated_attribute; return sub { confess "Cannot assign a value to a read-only accessor" if @_ > 1; $attr->get_multi_value($_[0], {}); }; } sub _generate_writer_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->set_multi_value($_[0], {}, $_[1]); }; } sub _generate_predicate_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->has_multi_value($_[0], {}) }; } sub _generate_clearer_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->clear_multi_value($_[0], {}) }; } =method C<_generate_multi_accessor_method> =method C<_generate_multi_reader_method> =method C<_generate_multi_writer_method> =method C<_generate_multi_predicate_method> =method C<_generate_multi_clearer_method> Delegate to C, C, C, C, passing C<$_[1]> as options and C<$_[2]> as values. =cut sub _generate_multi_accessor_method { my $self = shift; my $attr = $self->associated_attribute; return sub { if (@_ >= 3) { $attr->set_multi_value($_[0], $_[1], $_[2]); } $attr->get_multi_value($_[0],$_[1]); } } sub _generate_multi_reader_method { my $self = shift; my $attr = $self->associated_attribute; return sub { confess "Cannot assign a value to a read-only accessor" if @_ > 2; $attr->get_multi_value($_[0],$_[1]); }; } sub _generate_multi_writer_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->set_multi_value($_[0], $_[1], $_[2]); }; } sub _generate_multi_predicate_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->has_multi_value($_[0],$_[1]) }; } sub _generate_multi_clearer_method { my $self = shift; my $attr = $self->associated_attribute; return sub { $attr->clear_multi_value($_[0],$_[1]) }; } 1;