Вы определили атрибут _sql_lib
дважды, однажды сказав isa Str
и однажды сказав, что он обрабатывает методы (а Str
нет), но вы не об этом говорите.
Основная проблема в том, что вы не определили _sql_lib
с lazy => 1
.Любой атрибут, чей конструктор (или default
) зависит от других атрибутов объекта, должен быть lazy
, поскольку Moose не гарантирует порядок, в котором атрибутам присваиваются значения во время построения объекта.
# REMOVE THIS:
#has '_sql_lib' => (#FOLDBEG
# builder => '_sql_lib_builder',
# is => 'rw',
# isa => 'Str',
#);
has '_sql_lib' => (#FOLDBEG
builder => '_sql_lib_builder',
is => 'rw',
lazy => 1, # ADD THIS LINE
handles => {
get_sql => 'retr',
get_elements => 'elements',
},
);
Причина, по которой make_immutable
выявляет ошибку, заключается в том, что при ее вызове генерируется другой конструктор для вашего класса, который инициализирует атрибуты в другом порядке.