diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-12-27 04:57:50 -0600 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-12-27 04:57:50 -0600 |
commit | 18e0c21c891deec7847d2cb43fc4e48d85baa219 (patch) | |
tree | 040a5c49fb69b456fec519cc55c5872494573997 /lib/Bread | |
download | p6-bread-board-18e0c21c891deec7847d2cb43fc4e48d85baa219.tar.gz p6-bread-board-18e0c21c891deec7847d2cb43fc4e48d85baa219.zip |
start working on this
Diffstat (limited to 'lib/Bread')
-rw-r--r-- | lib/Bread/Board.pm | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/Bread/Board.pm b/lib/Bread/Board.pm new file mode 100644 index 0000000..c3d1a26 --- /dev/null +++ b/lib/Bread/Board.pm @@ -0,0 +1,81 @@ +use v6; + +class Bread::Board::Dependency {...} + +role Bread::Board::Service { + has Str $.name; + + # XXX not sure how to make these optional - specifying the types here + # makes it fail when the parameters aren't passed + # shouldn't the " = {}" part be taking care of that? + # has Hash of Bread::Board::Dependency $.dependencies = {}; + # has Hash of Hash $.parameters = {}; + has $.dependencies = {}; + has $.parameters = {}; + + # XXX overriding new here is an extremely suboptimal solution + # does perl 6 have anything like moose's coercions? + 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}, + ); + } + %params.<dependencies> = $deps; + } + nextwith(|%params); + } + + method get {*}; + + method get_dependency ($name) { + return $.dependencies.{$name}; + } +} + +class Bread::Board::Dependency { + has Bread::Board::Service $.service handles 'get'; +} + +class Bread::Board::ConstructorInjection does Bread::Board::Service { + has $.class; + has Str $.constructor_name is rw = 'new'; + + method get (*%params is copy) { + self.check_parameters(%params); + for $.dependencies.keys -> $name { + %params{$name} = $.dependencies{$name}.get; + } + return $.class."$.constructor_name"(|%params); + } + + my method check_parameters (%params) { + for $.parameters.keys -> $name { + if not %params.{$name}:exists { + die "Required parameter $name not given"; + } + } + + for %params.keys -> $name { + if not $.parameters.{$name}:exists { + die "Unknown parameter $name given"; + } + if not %params.{$name}.isa($.parameters.{$name}.<isa>) { + die "{%params.{$name}.perl} is not a valid value for the $name parameter"; + } + } + + # XXX why is this return necessary? + return; + } +} + +class Bread::Board::Literal does Bread::Board::Service { + has $.value; + + method get { + return $.value; + } +} |