package Data::MultiValued::AttributeAccessors; use strict; use warnings; use base 'Moose::Meta::Method::Accessor'; use Carp 'confess'; sub _instance_is_inlinable { 0 } 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], {}) }; } 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;