summaryrefslogtreecommitdiffstats
path: root/lib/Bread/Board.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bread/Board.pm')
-rw-r--r--lib/Bread/Board.pm78
1 files changed, 60 insertions, 18 deletions
diff --git a/lib/Bread/Board.pm b/lib/Bread/Board.pm
index c3d1a26..aba64df 100644
--- a/lib/Bread/Board.pm
+++ b/lib/Bread/Board.pm
@@ -9,9 +9,7 @@ role Bread::Board::Service {
# 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?
@@ -35,23 +33,14 @@ role Bread::Board::Service {
}
}
-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);
- }
+role Bread::Board::HasParameters {
+ # 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 Hash $.parameters = {};
+ has $.parameters = {};
- my method check_parameters (%params) {
+ method check_parameters (%params) {
for $.parameters.keys -> $name {
if not %params.{$name}:exists {
die "Required parameter $name not given";
@@ -72,6 +61,59 @@ class Bread::Board::ConstructorInjection does Bread::Board::Service {
}
}
+class Bread::Board::Dependency {
+ has Bread::Board::Service $.service handles 'get';
+}
+
+class Bread::Board::ConstructorInjection
+ does Bread::Board::Service
+ does Bread::Board::HasParameters {
+
+ has $.class;
+ has Str $.constructor_name is rw = 'new';
+
+ method get (*%params is copy) {
+ # XXX remove more duplication?
+ self.check_parameters(%params);
+ for $.dependencies.keys -> $name {
+ %params{$name} = $.dependencies{$name}.get;
+ }
+ return $.class."$.constructor_name"(|%params);
+ }
+}
+
+class Bread::Board::Parameters {
+ has Hash $.params;
+ # XXX do we really want to keep this API?
+ has $.class;
+
+ method param (Str $name) {
+ return $.params.{$name};
+ }
+}
+
+class Bread::Board::BlockInjection
+ does Bread::Board::Service
+ does Bread::Board::HasParameters {
+
+ has Callable $.block;
+ has $.class = Any;
+
+ method get (*%params is copy) {
+ # XXX remove more duplication?
+ self.check_parameters(%params);
+ for $.dependencies.keys -> $name {
+ %params{$name} = $.dependencies{$name}.get;
+ }
+ return $.block.(
+ Bread::Board::Parameters.new(
+ params => %params,
+ class => $.class,
+ )
+ );
+ }
+}
+
class Bread::Board::Literal does Bread::Board::Service {
has $.value;