# New Ticket Created by  Pierre VIGIER 
# Please include the string:  [perl #127959]
# in the subject line of all future correspondence about this issue. 
# <URL: https://rt.perl.org/Ticket/Display.html?id=127959 >


Hi

Basically, i have a trait that add a method to a class if applied to an 
attribute
it's working well
however, if i try to 'use' a class that uses that trait, i have a strange error:
Missing serialize REPR function for REPR SCRef

To show case the issue, here is a dummy module, that export a trait "mytrait".
That trait if applied to any attribute of a class, will add a new method nn to 
the class that returns 'nn'.
(the original module is AttrX::Lazy, just wanted to trimdown the code base)

file mytraitmodule.pm6 contains that trait

you can see that tiny trait in action with the following:
> PERL6LIB=$PWD perl6 -e 'use mytraitmodule; class Foo { has $!att is mytrait; 
> }; say Foo.new().nn()'                            [22:18:23]
> nn

The trait is working fine.

Now, if i create a class in a separate file, that does the same thing, and load 
the class, for the class see file myclass.pm6
and i just try to use that new class, with a simple code like:
> PERL6LIB=$PWD perl6 -e 'use myclass;'                                         
>                                                  [22:18:12]
===SORRY!===
Missing serialize REPR function for REPR SCRef

You see the issue, really strange, the trait is working by itself, but it's 
impossible to load a class that uses that trait

RabidGravy on IRC told me to add a no precompilation statement on top of the 
file having the role to temporary solve the issue, and i can confirm it is 
working.

Content of the files:
myclass.pm6:
--------------------
unit class myclass;
use mytraitmodule;

has $!bar is mytrait;
--------------------


mytraitmodule.pm6:
--------------------
unit module mytraitmodule;
my role rrHOW {
    method compose(Mu \type) {
        type.^add_method('nn', method (Mu:D:) { return 'nn' ; } );
        callsame;
    }
}

multi trait_mod:<is>(Attribute:D $attr, :$mytrait! ) is export {
    $attr.package.HOW does rrHOW;
}
--------------------


Pierre

Reply via email to