@@ -13,10 +13,12 @@ my class RegistryEntry {
1313my Lock : D $ registry-lock .= new ; # = Lock controlling access to registry
1414my % registry ; # = Primary registry: moniker to RegistryEntry
1515my % layout-class ; # = Cache: builder-name to layout-class
16+ my % widget-class {Any }; # = Cache: layout-class to widget-class
1617
1718
1819# | Registry for Widget subclasses and matching Layout classes
1920role Terminal::Widgets::WidgetRegistry {
21+ # | Register a widget class and related details
2022 method register-widget (Str : D : $ moniker ! , Str : D : $ builder-name ! ,
2123 Any : U : $ widget-class ! , Any : U : $ layout-class ! ) {
2224 my $ entry = RegistryEntry. new (: $ moniker , : $ builder-name ,
@@ -25,9 +27,13 @@ role Terminal::Widgets::WidgetRegistry {
2527 $ registry-lock . protect: {
2628 % registry {$ moniker } = $ entry ;
2729 % layout-class {$ builder-name } = $ layout-class ;
30+ % widget-class {$ layout-class } = $ widget-class ;
2831 }
2932 }
3033
34+
35+ # ## BASIC LOOKUPS
36+
3137 method registry-entry (Str : D $ moniker ) {
3238 $ registry-lock . protect: { % registry {$ moniker } }
3339 }
@@ -36,6 +42,13 @@ role Terminal::Widgets::WidgetRegistry {
3642 $ registry-lock . protect: { % layout-class {$ builder-name } }
3743 }
3844
45+ method widget-for-layout ($ layout-class ) {
46+ $ registry-lock . protect: { % widget-class {$ layout-class } }
47+ }
48+
49+
50+ # ## EXISTENCE CHECKS
51+
3952 method widget-exists (Str : D $ moniker ) {
4053 $ registry-lock . protect: { % registry {$ moniker }: exists }
4154 }
@@ -44,6 +57,13 @@ role Terminal::Widgets::WidgetRegistry {
4457 $ registry-lock . protect: { % layout-class {$ builder-name }: exists }
4558 }
4659
60+ method layout-exists ($ layout-class ) {
61+ $ registry-lock . protect: { % widget-class {$ layout-class }: exists }
62+ }
63+
64+
65+ # ## KNOWN TYPE ITERABLES
66+
4767 method known-widgets () {
4868 $ registry-lock . protect: { % registry . keys . sort }
4969 }
@@ -52,6 +72,17 @@ role Terminal::Widgets::WidgetRegistry {
5272 $ registry-lock . protect: { % layout-class . keys . sort }
5373 }
5474
75+ method known-layout-classes () {
76+ $ registry-lock . protect: { % widget-class . keys }
77+ }
78+
79+ method known-widget-classes () {
80+ $ registry-lock . protect: { % widget-class . values }
81+ }
82+
83+
84+ # ## REGISTRY ENTRY ACCESSOR HELPERS
85+
5586 method builder-name (Str : D $ moniker ) {
5687 my $ entry = self . registry-entry($ moniker );
5788 $ entry ?? $ entry . builder-name !! Nil
0 commit comments