summaryrefslogtreecommitdiff
path: root/lib/Data/MultiValued/AttributeAccessors.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Data/MultiValued/AttributeAccessors.pm')
-rw-r--r--lib/Data/MultiValued/AttributeAccessors.pm154
1 files changed, 154 insertions, 0 deletions
diff --git a/lib/Data/MultiValued/AttributeAccessors.pm b/lib/Data/MultiValued/AttributeAccessors.pm
new file mode 100644
index 0000000..8480f98
--- /dev/null
+++ b/lib/Data/MultiValued/AttributeAccessors.pm
@@ -0,0 +1,154 @@
+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.
+
+=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<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], {})
+ };
+}
+
+=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<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;