Frage Gesegnete CodeRefs mit Moose-Typ-Einschränkungen verwenden


Wir verwenden Moose-Klassen, die Iteratoren in verschiedene Ausgabeformate serialisieren. Wir beschreiben den Iterator als ein Attribut:

has iterator => (
    is => 'ro',
    isa => 'CodeRef',
    required => 1,
);

Das hat bisher gut funktioniert, aber wir haben es in letzter Zeit benutzt Iterator :: Einfach Iteratoren für späteren Verbrauch vorzubereiten. Das bedeutet, dass wir das schreiben können:

has iterator => (
    is => 'ro',
    isa => 'CodeRef|Iterator::Simple::Iterator',
    required => 1,
);

Und erlauben Sie unseren Serializern, die Iterator-Klasse korrekt zu akzeptieren. Dies scheint jedoch eine unvollständige Lösung zu sein.

Gibt es in Moose eine Möglichkeit, die Einschränkung anzugeben, dass das Attribut aufrufbar sein muss? Ich vermute, dass es möglich ist mit Elch :: Util :: TypeConstraints und verwenden Überlast :: Überlastet  auf &{} zu überprüfen, aber ich würde gerne wissen, ob jemand ein Modul erstellt hat, um dies bereits zu tun oder wenn es eine Moose-Standard-Methode gibt, um dies zu testen.


5
2018-01-26 17:03


Ursprung


Antworten:


CodeRef erlaubt nur ungültige Code-Referenzen. Glücklicherweise ist es einfach, eigene Typen zu erstellen.

Definieren Callable wie unten gezeigt, dann benutze es statt CodeRef. Es ermöglicht Folgendes:

  • Ungültige Codereferenzen
  • Code-Referenzen.
  • Objekte, die vorgeben, Codereferenzen zu sein (d. H. Solche, die überladen &{}).

 

use Moose::Util::TypeConstraints;
use overload     qw( );
use Scalar::Util qw( );

subtype 'Callable'
    => as 'Ref'
    => where {
          Scalar::Util::reftype($_) eq 'CODE'
             ||
          Scalar::Util::blessed($_) && overload::Method($_, "&{}")
       }

    # Written such that parent's inline_as needs not be prepended.
    => inline_as {'(
          (Scalar::Util::reftype('.$_[1].') // "") eq 'CODE'
             ||
          Scalar::Util::blessed('.$_[1].') && overload::Method('.$_[1].', "&{}")
       )'};

no Moose::Util::TypeConstraints;

4
2018-01-26 19:22



Weißt du genug, um davon zu kommen? Skalar :: Util :: Ref-Typ?


0
2018-01-26 19:22