summaryrefslogtreecommitdiffstats
path: root/lib/MooseX/Module
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2009-12-19 14:05:25 -0600
committerJesse Luehrs <doy@tozt.net>2009-12-19 14:05:25 -0600
commit129e7fac6fc245bf498a8bbea34a74edb2147784 (patch)
tree01f80d6d673e7fee1a9482b86b0e77af06053100 /lib/MooseX/Module
parentc34ffdfa73ddf5d1982f368b1e30364b17960f07 (diff)
downloadmoosex-module-refresh-129e7fac6fc245bf498a8bbea34a74edb2147784.tar.gz
moosex-module-refresh-129e7fac6fc245bf498a8bbea34a74edb2147784.zip
initial implementation
Diffstat (limited to 'lib/MooseX/Module')
-rw-r--r--lib/MooseX/Module/Refresh.pm46
1 files changed, 45 insertions, 1 deletions
diff --git a/lib/MooseX/Module/Refresh.pm b/lib/MooseX/Module/Refresh.pm
index ce42ead..d8a77a5 100644
--- a/lib/MooseX/Module/Refresh.pm
+++ b/lib/MooseX/Module/Refresh.pm
@@ -1,6 +1,8 @@
package MooseX::Module::Refresh;
use Moose;
+extends 'Module::Refresh';
+
=head1 NAME
MooseX::Module::Refresh -
@@ -13,7 +15,49 @@ MooseX::Module::Refresh -
=cut
-__PACKAGE__->meta->make_immutable;
+sub _pm_file_to_mod {
+ my ($file) = @_;
+ $file =~ s{\.pm$}{};
+ $file =~ s{/}{::}g;
+ return $file;
+}
+
+after unload_module => sub {
+ my $self = shift;
+ my $mod = _pm_file_to_mod($_[0]);
+ my $meta = Class::MOP::class_of($mod);
+ return unless defined $meta;
+ return unless $meta->isa('Moose::Meta::Class');
+ if ($meta->is_immutable) {
+ warn "Can't modify an immutable class";
+ return;
+ }
+ $self->unload_methods($meta);
+ $self->unload_attrs($meta);
+ # XXX: this is probably wrong, but...
+ $meta->superclasses('Moose::Object');
+ bless $meta, 'Moose::Meta::Class';
+ # XXX: why is this breaking
+ #for my $attr ($meta->meta->get_all_attributes) {
+ #$attr->set_value($meta, $attr->default($meta));
+ #}
+};
+
+sub unload_methods {
+ my $self = shift;
+ my ($meta) = @_;
+ for my $meth ($meta->get_method_list) {
+ $meta->remove_method($meth)
+ unless exists $DB::sub{$meta->name . "::$meth"};
+ }
+}
+
+sub unload_attrs {
+ my $self = shift;
+ my ($meta) = @_;
+ $meta->remove_attribute($_) for $meta->get_attribute_list;
+}
+
no Moose;
=head1 BUGS