Lingua-Thesaurus

 view release on metacpan or  search on metacpan

lib/Lingua/Thesaurus/Storage.pm  view on Meta::CPAN

package Lingua::Thesaurus::Storage;
use Moose::Role;
use Moose::Meta::Class;
use namespace::clean -except => 'meta';

#======================================================================
# ATTRIBUTES
#======================================================================

has 'params'           => (is => 'ro', isa => 'HashRef',
                           lazy => 1, builder => '_params',
                           predicate => 'has_params',
         documentation => "params saved in storage");

has 'term_class'       => (is => 'ro', isa => 'ClassName',
                           lazy => 1, builder => '_build_term_class',
                           init_arg => undef,
         documentation => "dynamic class for terms");

has 'relType_class'    => (is => 'ro', isa => 'ClassName',
                           lazy => 1, builder => '_relType_class',
                           init_arg => undef,
         documentation => "class for relTypes");

#======================================================================
# REQUIRED METHODS
#======================================================================

requires 'search_terms';
requires 'fetch_term';
requires 'related';
requires 'rel_types';
requires 'fetch_rel_type';

requires 'do_transaction';
requires 'initialize';
requires 'store_rel_type';
requires 'store_relation';
requires 'store_term';
requires 'finalize';

requires '_params';

#======================================================================
# IMPLEMENTED METHODS
#======================================================================

sub _build_term_class {
  my ($self) = @_;

  # compute subclass name from the list of possible relations
  my @rel_ids       = $self->rel_types;
  my $subclass_name = join "_", "auto", sort @rel_ids;
  my $parent_class  = $self->_parent_term_class;
  my $pkg_name      = "${parent_class}::${subclass_name}";

  # build subclass (only if it does not already exist)
  no strict 'refs';
  unless (%{$pkg_name."::"}) {
    # build a closure for each relation type (NT, BT, etc.)
    my %methods;
    foreach my $rel_id (@rel_ids) {
      $methods{$rel_id} = sub {my $self = shift;
                               my @rel  = map {$_->[1]} $self->related($rel_id);
                               return wantarray ? @rel : $rel[0];};
    }

    # dynamically create a new subclass
    my $meta_subclass = Moose::Meta::Class->create(
      $pkg_name,



( run in 2.464 seconds using v1.01-cache-2.11-cpan-98e64b0badf )