Class-Refresh
view release on metacpan or search on metacpan
lib/Class/Refresh.pm view on Meta::CPAN
}
sub _dependent_modules {
my $class = shift;
my ($mod) = @_;
$mod = $class->_file_to_mod($mod);
return ($mod) unless Class::Load::is_class_loaded('Class::MOP');
my $meta = Class::MOP::class_of($mod);
return ($mod) unless $meta;
if ($meta->isa('Class::MOP::Class')) {
# attribute cloning (has '+foo') means that we can't skip refreshing
# mutable classes
return (
# NOTE: this order is important!
$mod,
map { $class->_dependent_modules($_) }
($meta->subclasses,
# XXX: metacircularity? what if $class is Class::MOP::Class?
($mod->isa('Class::MOP::Class')
? (map { $_->name }
grep { $_->isa($mod) }
Class::MOP::get_all_metaclass_instances())
: ())),
);
}
elsif ($meta->isa('Moose::Meta::Role')) {
return (
$mod,
map { $class->_dependent_modules($_) } $meta->consumers,
);
}
else {
die "Unknown metaclass: $meta";
}
}
sub _update_cache_for {
my $class = shift;
my ($file) = @_;
$file = $class->_mod_to_file($file);
$CACHE{$file} = $class->_mtime($file);
}
sub _clear_cache_for {
my $class = shift;
my ($file) = @_;
$file = $class->_mod_to_file($file);
delete $CACHE{$file};
}
sub _mtime {
my $class = shift;
my ($file) = @_;
$file = $class->_mod_to_file($file);
return 1 if !$INC{$file};
return join ' ', (stat($INC{$file}))[1, 7, 9];
}
sub _file_to_mod {
my $class = shift;
my ($file) = @_;
return $file unless $file =~ /\.pm$/;
my $mod = $file;
$mod =~ s{\.pm$}{};
$mod =~ s{/}{::}g;
return $mod;
}
sub _mod_to_file {
my $class = shift;
my ($mod) = @_;
return $mod unless $mod =~ /^\w+(?:::\w+)*$/;
my $file = $mod;
$file =~ s{::}{/}g;
$file .= '.pm';
return $file;
}
1;
__END__
=pod
=head1 NAME
Class::Refresh - refresh your classes during runtime
=head1 VERSION
version 0.07
=head1 SYNOPSIS
use Class::Refresh;
use Foo;
Class::Refresh->refresh;
# edit Foo.pm
Class::Refresh->refresh; # changes in Foo.pm are applied
=head1 DESCRIPTION
During development, it is fairly common to cycle between writing code and
testing that code. Generally the testing happens within the test suite, but
frequently it is more convenient to test things by hand when tracking down a
bug, or when doing some exploratory coding. In many situations, however, this
( run in 0.661 second using v1.01-cache-2.11-cpan-39bf76dae61 )