summaryrefslogtreecommitdiffstats
path: root/lib/Bread/Board.pm
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-12-27 06:19:17 -0600
committerJesse Luehrs <doy@tozt.net>2012-12-27 06:19:17 -0600
commite6019e8a4187426482e18ebf80cc0ba482614486 (patch)
tree2f23874aea7fd757a8a9f70eb47d966008994c2d /lib/Bread/Board.pm
parent8e670dd6512860312aa9ee3dd59c71fba7f182a5 (diff)
downloadp6-bread-board-e6019e8a4187426482e18ebf80cc0ba482614486.tar.gz
p6-bread-board-e6019e8a4187426482e18ebf80cc0ba482614486.zip
sketch out containers
Diffstat (limited to 'lib/Bread/Board.pm')
-rw-r--r--lib/Bread/Board.pm60
1 files changed, 56 insertions, 4 deletions
diff --git a/lib/Bread/Board.pm b/lib/Bread/Board.pm
index aba64df..d1d6385 100644
--- a/lib/Bread/Board.pm
+++ b/lib/Bread/Board.pm
@@ -1,9 +1,11 @@
use v6;
+class Bread::Board::Container {...}
class Bread::Board::Dependency {...}
role Bread::Board::Service {
has Str $.name;
+ has Bread::Board::Container $.parent is rw = Bread::Board::Container;
# XXX not sure how to make these optional - specifying the types here
# makes it fail when the parameters aren't passed
@@ -16,10 +18,11 @@ role Bread::Board::Service {
method new (*%params is copy) {
if %params.<dependencies> {
my $deps = {};
- for %params.<dependencies>.keys -> $dep {
- $deps.{$dep} = Bread::Board::Dependency.new(
- service => %params.<dependencies>.{$dep},
- );
+ for %params.<dependencies>.keys -> $name {
+ my $dep = %params.<dependencies>.{$name};
+ $deps.{$name} = $dep.isa(Bread::Board::Dependency)
+ ?? $dep
+ !! Bread::Board::Dependency.new(service => $dep);
}
%params.<dependencies> = $deps;
}
@@ -121,3 +124,52 @@ class Bread::Board::Literal does Bread::Board::Service {
return $.value;
}
}
+
+class Bread::Board::Container {
+ has Str $.name;
+ has Bread::Board::Container $.parent is rw = Bread::Board::Container;
+ # XXX again, as above
+ # has Hash of Bread::Board::Container $.sub_containers = {};
+ # has Hash of Bread::Board::Service $.services = {};
+ has $.sub_containers = {};
+ has $.services = {};
+
+ # XXX again, as above
+ method new (*%params is copy) {
+ if %params.<sub_containers>.isa(Array) {
+ %params.<sub_containers> = %params.<sub_containers>.map(-> $c { $c.name => $c }).hash;
+ }
+ if %params.<services>.isa(Array) {
+ %params.<services> = %params.<services>.map(-> $c { $c.name => $c }).hash;
+ }
+ my $container = callwith(|%params);
+ if %params.<sub_containers>:exists {
+ for %params.<sub_containers>.values -> $c {
+ $c.parent = $container;
+ }
+ }
+ if %params.<services>:exists {
+ for %params.<services>.values -> $c {
+ $c.parent = $container;
+ }
+ }
+ return $container;
+ }
+
+ method add_sub_container (Bread::Board::Container $c) {
+ $.sub_containers.{$c.name} = $c;
+ $c.parent = self;
+ }
+
+ method get_sub_container (Str $name) {
+ return $.sub_containers.{$name};
+ }
+
+ method has_services {
+ return $.services > 0;
+ }
+
+ method get_service (Str $name) {
+ return $.services.{$name};
+ }
+}