Show
Ignore:
Timestamp:
04/03/08 00:14:10 (5 years ago)
Author:
yappo
Message:

lang/perl/Class-Component: 遅くて何回も呼ばれそうな所にキャッシュいれて早くした

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Class-Component/trunk/lib/Class/Component.pm

    r8659 r8683  
    104104    my $pkg; 
    105105    if (($pkg = $component) =~ s/^\+// || ($pkg = $c->class_component_load_component_resolver($component))) { 
    106         if (Class::Inspector->installed($pkg)) { 
    107             $pkg->require or croak $@; 
    108         } else { 
    109             croak "$pkg is not installed"; 
    110         } 
     106        $pkg->require or croak $@; 
    111107    } else { 
    112         for my $isa_pkg (@{ $class->isa_list_cache($c) }) { 
    113             my $comp = "$isa_pkg\::Component::$component"; 
    114             next unless Class::Inspector->installed($comp); 
    115             $comp->require or croak $@; 
    116             $pkg = $comp; 
    117             last; 
    118         } 
    119         croak "$component is not installed" unless $pkg; 
     108        unless ($pkg = $class->pkg_require($c => "Component::$component")) { 
     109            $@ and croak $@; 
     110            croak "$component is not installed"; 
     111        } 
    120112    } 
    121113 
     
    178170        $pkg->require or croak $@; 
    179171    } else { 
    180         for my $isa_pkg (@{ $class->isa_list_cache($class->_class($c)) }) { 
    181             my $comp = "$isa_pkg\::Plugin::$plugin"; 
    182             next unless Class::Inspector->installed($comp); 
    183             $comp->require or croak $@; 
    184             $pkg = $comp; 
    185             last; 
    186         } 
    187         croak "$plugin is not installed" unless $pkg; 
     172        unless ($pkg = $class->pkg_require($c => "Plugin::$plugin")) { 
     173            $@ and croak $@; 
     174            croak "$plugin is not installed"; 
     175        } 
    188176    } 
    189177 
     
    388376    my($class, $c) = @_; 
    389377    ref($c) || $c; 
     378} 
     379 
     380my %pkg_require_cache = (); 
     381sub pkg_require_cache_clear { %pkg_require_cache = () } 
     382my $ins = 0; 
     383sub _pkg_require { 
     384    my($class, $pkg) = @_; 
     385 
     386    if (exists $pkg_require_cache{$pkg}) { 
     387        return $pkg_require_cache{$pkg} ? $pkg : undef; 
     388    } 
     389    $pkg_require_cache{$pkg} = 0; 
     390 
     391    return unless Class::Inspector->installed($pkg); 
     392    $pkg->require or return; 
     393    $pkg_require_cache{$pkg} = 1; 
     394 
     395    return $pkg; 
     396} 
     397sub pkg_require { 
     398    my($class, $c, $pkg) = @_; 
     399 
     400    my $pkg2; 
     401    if (($pkg2 = $pkg) =~ s/^\+//) { 
     402        return $class->_pkg_require($pkg2); 
     403    } 
     404    for my $isa_pkg (@{ $class->isa_list_cache($c) }) { 
     405        my $ret = $class->_pkg_require("$isa_pkg\::$pkg"); 
     406        return $ret if $ret; 
     407        return if $@; 
     408    } 
    390409} 
    391410