diff options
Diffstat (limited to 'lib/MooseX/Module')
-rw-r--r-- | lib/MooseX/Module/Refresh.pm | 46 |
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 |