diff options
Diffstat (limited to 'lib/Data/MultiValued/AttributeAccessors.pm')
-rw-r--r-- | lib/Data/MultiValued/AttributeAccessors.pm | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/lib/Data/MultiValued/AttributeAccessors.pm b/lib/Data/MultiValued/AttributeAccessors.pm new file mode 100644 index 0000000..64063da --- /dev/null +++ b/lib/Data/MultiValued/AttributeAccessors.pm @@ -0,0 +1,156 @@ +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<Moose::Meta::Method::Accessor>, generates non-inlined +(patches welcome) accessors for multi-valued attributes. + +=head1 METHDOS + +=head2 C<_instance_is_inlinable> + +Returns C<0> to prevent attempts to inline the accessor methods. + +=cut + +sub _instance_is_inlinable { 0 } + +=head2 C<_generate_accessor_method> + +=head2 C<_generate_reader_method> + +=head2 C<_generate_writer_method> + +=head2 C<_generate_predicate_method> + +=head2 C<_generate_clearer_method> + +Delegate to C<set_multi_value>, C<get_multi_value>, +C<has_multi_value>, C<clear_multi_value>, 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], {}) + }; +} + +=head2 C<_generate_multi_accessor_method> + +=head2 C<_generate_multi_reader_method> + +=head2 C<_generate_multi_writer_method> + +=head2 C<_generate_multi_predicate_method> + +=head2 C<_generate_multi_clearer_method> + +Delegate to C<set_multi_value>, C<get_multi_value>, +C<has_multi_value>, C<clear_multi_value>, 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; |