The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

MOP4Import::Types - create multiple inner-classes at once.

SYNOPSIS

Create inner-classes MyApp::Artist and MyApp::CD using MOP4Import::Types.

  package MyApp;
  use MOP4Import::Types
    (Artist => [[fields => qw/artistid name/]]
     , CD   => [[fields => qw/cdid artistid title year/]]);

Then you can use above types like following with static checking of fields.

  sub print_artist_cds {
    (my $self, my Artist $artist) = @_;
    my @cds = $self->DB->select(CD => {artistid => $artist->{artistid}});
    foreach my CD $cd (@cds) {
      print tsv($cd->{title}, $cd->{year}), "\n";
    }
  }

DESCRIPTION

MOP4Import::Types is yet another protocol implementation of MOP4Import family.

In contrast to MOP4Import::Declare, which is designed to modify target module itself, this module is designed to add new inner-classes to target module.

With "inner-class", I mean class declared in some module and not directly exposed as "require" able module.

"MetaObject Protocol for Import" in this module

import() method of MOP4Import::Types briefly does following:

  sub import {
    my ($myPack, @pairs) = @_;
  
    my $callpack = caller;
    my $opts = +{};
  
    while (my ($typename, $pragma_list) = splice @pairs, 0, 2) {
  
      my $innerClass = join("::", $callpack, $typename);
  
      $myPack->declare___type($opts, $callpack, $typename, $innerClass);
  
    }
  }