]> ruin.nu Git - NDIRC.git/blobdiff - Bot.pm
Some module preloading and cleanup
[NDIRC.git] / Bot.pm
diff --git a/Bot.pm b/Bot.pm
index 53cdf94a0cf5cc983d64bf8d04a937e99cf5e802..9a289f0695a55a39866706d9f199a5bd491ecb26 100644 (file)
--- a/Bot.pm
+++ b/Bot.pm
@@ -115,9 +115,66 @@ sub sig_usr1 {
        $kernel->yield( 'refresh' );
 }
 
+sub clear_constraint {
+       my $tc = shift;
+
+       while (1) {
+               if (ref $tc eq 'MooseX::Meta::TypeConstraint::Structured'){
+                       for my $t (@{$tc->{type_constraints}}){
+                               clear_constraint($t);
+                       }
+
+               }
+               if (ref $tc eq 'Moose::Meta::TypeConstraint::Parameterized'){
+                       clear_constraint($tc->{type_parameter});
+               }
+               last if ref $tc eq 'HASH';
+               last if ref $tc eq '';
+               if (defined $tc->{_type_constraint}){
+                       $tc = $tc->{_type_constraint};
+               }elsif(defined $tc->{__type_constraint}){
+                       $tc = $tc->{__type_constraint};
+               }else{
+                       last;
+               }
+       }
+}
+
+sub clear_metains {
+       my $ins = shift;
+
+       for my $a (@{$ins->{attributes}}){
+               for my $m (@{$a->{associated_methods}}){
+                       $m->{body} = undef;
+               }
+               clear_constraint($a->{isa});
+       }
+}
+
+sub clear_cycles {
+       my $c = shift;
+
+       for my $m (values %{$c->meta->{methods}}){
+               clear_constraint($m->{type_constraint});
+
+               my $ps = $m->{parsed_signature};
+               for my $p (@{$ps->{_positional_params}->{params}}){
+                       clear_metains($p->{__MOP__}->{_meta_instance});
+               }
+
+               $m->{body} = undef;
+       }
+       clear_metains($c->meta->{_meta_instance});
+}
+
+
 sub sig_usr2 {
        my $self = shift @_;
 
+       for my $c (values %{$self->disp->commands}){
+               clear_cycles($c);
+       }
+
        $self->disp($self->_build_disp);
 }