clone_or_self
Matt S Trout [Thu, 1 Dec 2011 22:53:52 +0000 (22:53 +0000)]
lib/Tak/Client.pm
lib/Tak/Role/Service.pm
lib/Tak/Router.pm
lib/Tak/WeakClient.pm

index e8f7d60..a86ad4d 100644 (file)
@@ -54,4 +54,12 @@ sub result_of {
   return $result;
 }
 
+sub clone_or_self {
+  my ($self) = @_;
+  (ref $self)->new(
+    service => $self->service->clone_or_self, 
+    curried => [ @{$self->curried} ],
+  );
+}
+
 1;
index 3ee3d7f..5bcf7ca 100644 (file)
@@ -33,4 +33,9 @@ sub receive {
   }
 }
 
+# This assumes that by default either services are not stateful
+# or do want to have persistent state. It's notably overriden by Router.
+
+sub clone_or_self { $_[0] }
+
 1;
index a8b071c..7637c1c 100644 (file)
@@ -42,11 +42,9 @@ sub deregister {
   delete $self->services->{$name}
 }
 
-sub clone {
+sub clone_or_self {
   my ($self) = @_;
-  my $new = (ref $self)->new(services => $self->services);
-  $new->register(meta => Tak::MetaService->new(router => $new));
-  $new;
+  (ref $self)->new(services => { %{$self->services} });
 }
 
 1;
index dd4ae0e..3beb39c 100644 (file)
@@ -6,4 +6,13 @@ extends 'Tak::Client';
 
 has service => (is => 'ro', required => 1, weak_ref => 1);
 
+sub clone_or_self {
+  my ($self) = @_;
+  my $new = $self->service->clone_or_self;
+  ($new ne $self->service
+    ? 'Tak::Client'
+    : ref($self))->new(service => $new, curried => [ @{$self->curried} ]);
+}
+    
+
 1;