diff options
author | Gianni Ceccarelli <dakkar@thenautilus.net> | 2011-11-10 11:33:52 +0000 |
---|---|---|
committer | Gianni Ceccarelli <dakkar@thenautilus.net> | 2011-11-10 11:33:52 +0000 |
commit | fbad620423ae33a33b12a0276b4da41bd40f59d7 (patch) | |
tree | d80454569a430efad469c8ec1d7805a325274cc3 /Data-MultiValued/lib/Data/MultiValued/AttributeTrait | |
parent | "fast" hash/bless for serialization (diff) | |
download | data-multivalued-fbad620423ae33a33b12a0276b4da41bd40f59d7.tar.gz data-multivalued-fbad620423ae33a33b12a0276b4da41bd40f59d7.tar.bz2 data-multivalued-fbad620423ae33a33b12a0276b4da41bd40f59d7.zip |
refactoring the traits
Diffstat (limited to 'Data-MultiValued/lib/Data/MultiValued/AttributeTrait')
-rw-r--r-- | Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tagged.pm | 213 | ||||
-rw-r--r-- | Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm | 12 |
2 files changed, 12 insertions, 213 deletions
diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tagged.pm b/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tagged.pm deleted file mode 100644 index 2a45506..0000000 --- a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tagged.pm +++ /dev/null @@ -1,213 +0,0 @@ -package Data::MultiValued::AttributeTrait::Tagged; -use Moose::Role; -use Data::MultiValued::Tags; -use Data::MultiValued::AttributeAccessors; -use MooseX::Types::Moose qw(Str HashRef); -use Try::Tiny; -use namespace::autoclean; - -has 'full_storage_slot' => ( - is => 'ro', - isa => Str, - lazy_build => 1, - init_arg => undef, -); -sub _build_full_storage_slot { shift->name . '__MULTIVALUED_STORAGE__' } - -around slots => sub { - my ($orig, $self) = @_; - return ($self->$orig(), $self->full_storage_slot); -}; - -sub set_full_storage { - my ($self,$instance) = @_; - - my $ret = Data::MultiValued::Tags->new(); - $self->associated_class->get_meta_instance->set_slot_value( - $instance, - $self->full_storage_slot, - $ret, - ); - return $ret; -} - -sub get_full_storage { - my ($self,$instance) = @_; - - return $self->associated_class->get_meta_instance - ->get_slot_value( - $instance, - $self->full_storage_slot, - ); -} - -sub full_storage { - my ($self,$instance) = @_; - - return $self->get_full_storage($instance) - || $self->set_full_storage($instance); -} - -sub accessor_metaclass { 'Data::MultiValued::AttributeAccessors' } - -after install_accessors => sub { - my ($self) = @_; - - my $class = $self->associated_class; - - for my $meth (qw(accessor reader writer predicate clearer)) { - my $check = "has_$meth"; - next unless $self->$check; - - my $type = "tagged_$meth"; - my $basename = $self->$meth; - - die 'MultiValued attribute trait is not compatible with subref accessors' - if ref($basename); - - my $name = "${basename}_tagged"; - - $class->add_method( - $self->_process_accessors($type => $name,0) - ); - } -}; - -sub load_tagged_value { - my ($self,$instance,$opts) = @_; - - my $value;my $found=1; - try { - $value = $self->full_storage($instance)->get($opts); - } - catch { - unless (ref($_) && $_->isa('Data::MultiValued::Exceptions::NotFound')) { - die $_; - } - $found = 0; - }; - - if ($found) { - $self->set_raw_value($instance,$value); - } - else { - $self->raw_clear_value($instance); - } -} - -sub raw_clear_value { - my ($self,$instance) = @_; - - $self->associated_class->get_meta_instance - ->deinitialize_slot( - $instance, - $self->name, - ); -} - -sub store_tagged_value { - my ($self,$instance,$opts) = @_; - - my $value = $self->get_raw_value($instance); - $self->full_storage($instance)->set({%$opts,value=>$value}); -} - -our $dyn_opts = {}; - -before get_value => sub { - my ($self,$instance) = @_; - - $self->load_tagged_value($instance,$dyn_opts); -}; - -sub get_tagged_value { - my ($self,$instance,$opts,$value) = @_; - - local $dyn_opts = $opts; - - return $self->get_value($instance,$value); -} - -after set_initial_value => sub { - my ($self,$instance,$value) = @_; - - $self->store_tagged_value($instance,$dyn_opts); -}; - -after set_value => sub { - my ($self,$instance,$value) = @_; - - $self->store_tagged_value($instance,$dyn_opts); -}; - -sub set_tagged_value { - my ($self,$instance,$opts,$value) = @_; - - local $dyn_opts = $opts; - - return $self->set_value($instance,$value); -} - -before has_value => sub { - my ($self,$instance) = @_; - - $self->load_tagged_value($instance,$dyn_opts); -}; - -sub has_tagged_value { - my ($self,$instance,$opts) = @_; - - local $dyn_opts = $opts; - - return $self->has_value($instance); -} - -after clear_value => sub { - my ($self,$instance) = @_; - - # XXX NIY - $self->full_storage($instance)->clear($dyn_opts); -}; - -sub clear_tagged_value { - my ($self,$instance,$opts) = @_; - - local $dyn_opts = $opts; - - return $self->clear_value($instance); -} - -sub get_tagged_read_method { - my $self = shift; - return $self->get_read_method . '_tagged'; -} - -sub get_tagged_write_method { - my $self = shift; - return $self->get_write_method . '_tagged'; -} - -sub _rebless_slot { - my ($self,$instance) = @_; - - my $st = $self->get_full_storage($instance); - return unless $st; - - bless $st, 'Data::MultiValued::Tags'; - $st->_rebless_storage; -} - -sub _as_hash { - my ($self,$instance) = @_; - - my $st = $self->get_full_storage($instance); - return unless $st; - - return $st->_as_hash; -} - -package Moose::Meta::Attribute::Custom::Trait::MultiValued::Tagged;{ -sub register_implementation { 'Data::MultiValued::AttributeTrait::Tagged' } -} - -1; diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm b/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm new file mode 100644 index 0000000..fff5776 --- /dev/null +++ b/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm @@ -0,0 +1,12 @@ +package Data::MultiValued::AttributeTrait::Tags; +use Moose::Role; +use Data::MultiValued::Tags; +with 'Data::MultiValued::AttributeTrait'; + +sub multivalue_storage_class { 'Data::MultiValued::Tags' }; + +package Moose::Meta::Attribute::Custom::Trait::MultiValued::Tags;{ +sub register_implementation { 'Data::MultiValued::AttributeTrait::Tags' } +} + +1; |