SYNOPSIS

      package ThirdDimension;
      use Moose::Role;
    
      has 'z' => (is => 'rw', isa => 'Int');
    
      package Point;
      use Moose;
      use MooseX::Storage;
    
      with Storage( base => 'SerializedClass', traits => [ 'WithRoles' ] );
    
      has 'x' => (is => 'rw', isa => 'Int');
      has 'y' => (is => 'rw', isa => 'Int');
    
      1;
    
      use Moose::Util qw/ with_traits /;
    
      my $p = with_traits( 'Point', 'ThirdDimension' )->new(x => 10, y => 10, z => 10);
    
      my $packed = $p->pack(); 
      # { __CLASS__ => 'Point', '__ROLES__' => [ 'ThirdDimension' ], x => 10, y => 10, z => 10 }
    
      # unpack the hash into a class
      my $p2 = Point->unpack($packed);
    
      print $p2->z;

DESCRIPTION

    This trait is meant to be used when a base class will be consuming
    roles at runtime via (for example) with_traits. Without this trait, the
    '__CLASS__' attribute of the serialized object would be the name of the
    resulting anonymous class, which is useless to reconstruct the class
    after the fact.

    When this trait is used, the serialized __CLASS__ value will be the
    base class, and __ROLES__ will contain the list of roles that it
    consumes. If used in conjecture with
    MooseX::Storage::Base::SerializedClass, unpack() will reinflate the
    data in the right class augmented by the given roles.

    Oh yeah, and the trait also works with MooseX::Role::Parameterized
    roles. You're welcome, Sartak. ;-)