const widget_factory_t& default_asl_widget_factory()
{
    static bool             inited(false);
    static widget_factory_t default_factory_s;

    if (!inited)
    {
        name_t name_row("row"_name);
        name_t name_column("column"_name);
        name_t name_overlay("overlay"_name);
        name_t name_reveal("reveal"_name);
        name_t name_preset("preset"_name);
        name_t name_preview("preview"_name);
        name_t name_static_text("static_text"_name);
        name_t name_control_button("control_button"_name);

        default_factory_s.reg(name_column, &column_factory, true, column_layout_attributes());
        default_factory_s.reg(name_overlay, &overlay_factory, true, overlay_layout_attributes());
        default_factory_s.reg(name_row, &row_factory, true, row_layout_attributes());

        default_factory_s.reg(name_button, &make_button);
        default_factory_s.reg(name_checkbox, &make_checkbox);
        default_factory_s.reg(name_control_button, &make_control_button);
        default_factory_s.reg(name_dialog, &make_window, true, window_layout_attributes());
        default_factory_s.reg(name_display_number, &implementation::make_display_number);
        default_factory_s.reg(name_edit_number, &make_edit_number);
        default_factory_s.reg(name_edit_text, &implementation::make_edit_text);
        default_factory_s.reg(name_group, &make_group, true, group_layout_attributes());
#ifndef ADOBE_PLATFORM_NO_IMAGE
        default_factory_s.reg(name_image, &implementation::make_image_hack);
#endif
        default_factory_s.reg(name_toggle, &make_toggle);
        default_factory_s.reg(name_label, &implementation::make_label_hack);
#ifndef ADOBE_PLATFORM_NO_LINK
        default_factory_s.reg(name_link, &make_link, false, link_layout_attributes());
#endif
        default_factory_s.reg(name_optional, &make_optional_panel, true, optional_panel_layout_attributes());
        default_factory_s.reg(name_panel, &make_panel, true, panel_layout_attributes());
        default_factory_s.reg(name_popup, &make_popup);
#ifndef ADOBE_PLATFORM_NO_PRESETS
        default_factory_s.reg(name_preset, &make_presets);
#endif
        default_factory_s.reg(name_preview, &make_preview);
        default_factory_s.reg(name_progress_bar, &make_progress_bar);
        default_factory_s.reg(name_radio_button, &make_radio_button);
        default_factory_s.reg(name_reveal, &make_reveal);
        default_factory_s.reg(name_separator, &make_separator, false, separator_layout_attributes());
        default_factory_s.reg(name_slider, &make_slider);
        default_factory_s.reg(name_static_text, &implementation::make_label_hack);
        default_factory_s.reg(name_tab_group, &make_tab_group, true, tab_group_layout_attributes());

        inited = true;
    }

    return default_factory_s;
}