На ваш выбор, $obj->meta->name->new()
или (blessed $obj)->new()
оба являются самыми безопасными.
Способ реализации черт: вы создаете анонимный подкласс, применяете роли к этому подклассу и переводите экземпляр в этот подкласс. Это означает, что любое из этих решений будет хорошо работать с чертами. В Perl отсутствуют действительно анонимные подклассы (у каждого пакета должно быть пространство имен), Moose работает с этим, создавая имя в общем пространстве имен для анонимных классов.
Если бы вы потратили секунду, чтобы попробовать пример кода, вы бы увидели это в действии.
$perl -Moose -E'with q[MooseX::Traits];
package Role; use Moose::Role;
package main; say Class->with_traits(q[Role])->new->meta->name'
MooseX::Traits::__ANON__::SERIAL::1
Надеюсь, это поможет.