Class-Refresh

 view release on metacpan or  search on metacpan

lib/Class/Refresh.pm  view on Meta::CPAN

package Class::Refresh;
BEGIN {
  $Class::Refresh::AUTHORITY = 'cpan:DOY';
}
{
  $Class::Refresh::VERSION = '0.07';
}
use strict;
use warnings;
# ABSTRACT: refresh your classes during runtime

use Carp 'carp';
use Class::Unload;
use Class::Load;
use Try::Tiny;


our %CACHE;

sub import {
    my $package = shift;
    my %opts = @_;

    if ($opts{track_require}) {
        require Devel::OverrideGlobalRequire;
        require B;
        Devel::OverrideGlobalRequire::override_global_require(sub {
            my $next = shift;
            my ($file) = @_;

            my $ret = $next->();

            $package->_update_cache_for($file)
                # require v5.8.1;
                unless ref(\$file) eq 'VSTRING'
                # require 5.008001;
                || !(B::svref_2object(\$file)->FLAGS & B::SVf_POK());

            return $ret;
        });
    }
}


sub refresh {
    my $class = shift;

    $class->refresh_module($_) for $class->modified_modules;
}


sub modified_modules {
    my $class = shift;

    my @ret;
    for my $file (keys %CACHE) {
        # refresh files that are in our
        # %CACHE but not in %INC
        push @ret, $class->_file_to_mod($file)
            if (!$INC{$file});
    }

    for my $file (keys %INC) {
        if (exists $CACHE{$file}) {
            push @ret, $class->_file_to_mod($file)
                if $class->_mtime($file) ne $CACHE{$file};
        }
        else {
            $class->_update_cache_for($file);
        }
    }

    return @ret;
}



( run in 1.100 second using v1.01-cache-2.11-cpan-39bf76dae61 )