package Storm::Meta::Relationship; { $Storm::Meta::Relationship::VERSION = '0.19'; } use Moose; use MooseX::StrictConstructor; use MooseX::Types::Moose qw( HashRef ); has name =>( is => 'ro', isa => 'Str', required => 1, ); has 'associated_class' =>( is => 'rw', isa => 'ClassName', writer => '_set_associated_class', clearer => '_clear_associated_class', init_arg => undef, ); has 'foreign_class' => ( is => 'rw', isa => 'ClassName', writer => '_set_foreign_class' , weak_ref => 1, ); has 'handles' => ( is => 'ro', isa => HashRef, traits => [qw( Hash )], default => sub { { } }, handles => { get_handle => 'get', _set_handle => 'set', _handles => 'keys', } ); has '_handle_methods' => ( is => 'ro', isa => HashRef, builder => '_build_handle_methods' , lazy => 1, ); sub attach_to_class { my ( $self, $meta ) = @_; my $class = $meta->name; $self->_set_associated_class($class); my $methods = $self->_handle_methods; for my $method_name(keys %$methods) { $meta->add_method($method_name => $methods->{$method_name}); } $meta->_add_relationship( $self->name, $self ); } sub detach_from_class { my ( $self, $meta ) = @_; return unless $self->associated_class(); my $methods = $self->_handle_methods; for my $method_name(keys %$methods) { $self->associated_class->meta->remove_method($method_name); } $self->_clear_associated_class(); $meta->_remove_relationship( $self->name ); } 1;