Almost working sugar
[catagits/Catalyst-Runtime.git] / lib / Catalyst / IOC.pm
index a204295..0c6ad6e 100644 (file)
@@ -2,21 +2,24 @@ package Catalyst::IOC;
 use strict;
 use warnings;
 use Bread::Board;
-
-# FIXME - neither of these work:
-#use Sub::Exporter -setup => [
-#    qw(
-#        as
-#        container
-#        depends_on
-#        service
-#        alias
-#        wire_names
-#        include
-#        typemap
-#        infer
-#    )
-#];
+use Catalyst::IOC::ConstructorInjection;
+
+# FIXME - All of these imports need to get the importing package
+#         as the customise_container and current_container variables
+#         NEED to be in the containers package so there can be multiple
+#         containers..
+use Sub::Exporter -setup => {
+    exports => [qw/
+        component
+        model
+        container
+    /],
+    groups  => { default => [qw/
+        component
+        model
+        container
+    /]},
+};
 #use Sub::Exporter -setup => [
 #    qw(
 #        Bread::Board::as
@@ -32,10 +35,45 @@ use Bread::Board;
 #];
 # I'm probably doing it wrong.
 # Anyway, I'll just use Moose::Exporter. Do I really have to use Sub::Exporter?
-use Moose::Exporter;
-Moose::Exporter->setup_import_methods(
-    also => ['Bread::Board'],
-);
+#use Moose::Exporter;
+#Moose::Exporter->setup_import_methods(
+#    also => ['Bread::Board'],
+#);
+our $customise_container;
+our $current_container;
+
+sub container (&) {
+    my $code = shift;
+    $customise_container = sub {
+        warn("In customise container");
+        local $current_container = shift();
+        $code->();
+    };
+}
+
+sub model (&) {
+    my $code = shift;
+    local $current_container = $current_container->get_sub_container('model');
+    $code->();
+}
+
+sub component {
+    my ($name, %args) = @_;
+    $args{dependencies} ||= {};
+    $args{dependencies}{application_name} = depends_on( '/application_name' );
+
+    # FIXME - check $args{type} here!
+
+    my $service = Catalyst::IOC::ConstructorInjection->new(
+        %args,
+        name             => $name,
+        lifecycle        => 'Singleton',
+        # XX FIXME - needs to become possible to intuit catalyst_component_name
+        #            from dependencies (like config)
+        catalyst_component_name => 'TestAppCustomContainer::Model::Bar',
+    );
+    $current_container->add_service($service);
+}
 
 1;