summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2009-12-19 14:49:11 -0600
committerJesse Luehrs <doy@tozt.net>2009-12-19 15:08:50 -0600
commit0ffe95002cb4986ad3a2c18c1de274c425933085 (patch)
tree1c14257777b47bffaed05720230686965af065b9
parentc3c011becc51752c7e5476d8be0c88f3ca52619b (diff)
downloadmoosex-module-refresh-0ffe95002cb4986ad3a2c18c1de274c425933085.tar.gz
moosex-module-refresh-0ffe95002cb4986ad3a2c18c1de274c425933085.zip
reload all modules that depend on a reloaded module
-rw-r--r--lib/MooseX/Module/Refresh.pm31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/MooseX/Module/Refresh.pm b/lib/MooseX/Module/Refresh.pm
index 9831cd6..20ec28b 100644
--- a/lib/MooseX/Module/Refresh.pm
+++ b/lib/MooseX/Module/Refresh.pm
@@ -32,6 +32,37 @@ sub _pm_file_to_mod {
return $file;
}
+sub find_dependent_packages {
+ my $self = shift;
+ my ($package) = @_;
+ my $meta = Class::MOP::class_of($package);
+ return unless defined $meta;
+ if ($meta->isa('Moose::Meta::Class')) {
+ return $meta->subclasses;
+ }
+ elsif ($meta->isa('Moose::Meta::Role')) {
+ # XXX: can this be pushed back into Moose::Meta::Role?
+ my @classes;
+ for my $class_meta (Class::MOP::get_all_metaclass_instances) {
+ next unless $class_meta->isa('Moose::Meta::Class')
+ || $class_meta->isa('Moose::Meta::Role');
+ push @classes, $class_meta->name
+ if $class_meta->does_role($meta->name);
+ }
+ return @classes;
+ }
+ else {
+ die "unknown metaclass for $package ($meta)";
+ }
+}
+
+after refresh_module => sub {
+ my $self = shift;
+ my ($modfile) = @_;
+ $self->refresh_module(Class::MOP::_class_to_pmfile($_))
+ for $self->find_dependent_packages(_pm_file_to_mod($modfile));
+};
+
after unload_module => sub {
my $self = shift;
my $mod = _pm_file_to_mod($_[0]);