From 8e670dd6512860312aa9ee3dd59c71fba7f182a5 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 27 Dec 2012 05:28:07 -0600 Subject: block services --- lib/Bread/Board.pm | 78 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 18 deletions(-) (limited to 'lib') 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; -- cgit v1.2.3-54-g00ecf