http://www.perlmonks.org?node_id=780858


in reply to Re^2: MooseX::Types::TypeDecorator error
in thread MooseX::Types::TypeDecorator error

You should put your MooseX-Types library into a separate file. The method signatures are parsed at compile time, and if they are defined in the same package, they are not declared yet.


Ordinary morality is for ordinary people. -- Aleister Crowley
  • Comment on Re^3: MooseX::Types::TypeDecorator error

Replies are listed 'Best First'.
Re^4: MooseX::Types::TypeDecorator error
by KSURi (Monk) on Jul 17, 2009 at 09:09 UTC
    Yes, as some anonymous monk said above, that's why I put types declaration into BEGIN block (inlined for brevity). In real code these declarations are in a separate file.
Re^4: MooseX::Types::TypeDecorator error
by Anonymous Monk on Jul 17, 2009 at 06:29 UTC
    That is why BEGIN{} blocks were invented :)
    BEGIN { use MooseX::Declare; class Foo { use feature qw(say); use Data::Dumper; use MooseX::MultiMethods; use MooseX::Types -declare => [qw(Bar MyStr MyNum)]; use MooseX::Types::Moose qw(Str Num); use MooseX::Types::Structured qw(Dict); BEGIN { subtype MyStr, as Str; subtype MyNum, as Num; subtype Bar, as Dict[ string => MyStr, number => MyNum, ], message { 'Invalid Foo struct' }; }; multi method baz(Bar $barrr) { say'Bar'; say Dumper $barrr } multi method baz(Str $string) { say 'Str'; say Dumper $string; } } } no Moose; no MooseX::Declare; 1; package main; my $foo = Foo->new; $foo->baz( { string => 'hello', number => 1.00, } ); $foo->baz( 'hello world' )