Index: lang/perl/Class-Component/trunk/lib/Class/Component/Plugin.pm
===================================================================
--- lang/perl/Class-Component/trunk/lib/Class/Component/Plugin.pm (revision 8657)
+++ lang/perl/Class-Component/trunk/lib/Class/Component/Plugin.pm (revision 8683)
@@ -23,8 +23,17 @@
 sub init {}
 
+my %attribute_detect_cache = ();
+sub is_class_component_plugin_attribute_detect_cache { 1 };
 sub class_component_plugin_attribute_detect {
     my($self, $attr) = @_;
+    my $cache_key = sprintf '%s::%s', ref($self), $attr;
+    return @{ $attribute_detect_cache{$cache_key} } if $self->is_class_component_plugin_attribute_detect_cache && $attribute_detect_cache{$cache_key};
+    $attribute_detect_cache{$cache_key} = [];
+
     return unless my($key, $value) = ($attr =~ /^(.*?)(?:\(\s*(.+?)\s*\))?$/);
-    return ($key, $value) unless defined $value;
+    unless (defined $value) {
+        $attribute_detect_cache{$cache_key} = [$key, $value];
+        return ($key, $value);
+    }
 
     my $pkg    = ref $self;
@@ -35,4 +44,5 @@
     $value     = (@{ $data } > 1) ? $data : $data->[0];
 
+    $attribute_detect_cache{$cache_key} = [$key, $value];
     return ($key, $value);
 }
@@ -54,10 +64,10 @@
             next unless my($key, $value) = $self->class_component_plugin_attribute_detect($attr);
 
-            for my $isa_pkg (@{ Class::Component::Implement->isa_list_cache($c) }) {
-                my $attr_class = "$isa_pkg\::Attribute::$key";
-                next unless Class::Inspector->installed($attr_class);
-                $attr_class->require or croak "'$key' is not supported attribute";
-                $attr_class->register($self, $c, $data->{method}, $value, $data->{code});
+            my $attr_class = Class::Component::Implement->pkg_require($c => "Attribute::$key");
+            unless ($attr_class) {
+                next unless $@;
+                croak "'$key' is not supported attribute";
             }
+            $attr_class->register($self, $c, $data->{method}, $value, $data->{code});
         }
     }
Index: lang/perl/Class-Component/trunk/lib/Class/Component.pm
===================================================================
--- lang/perl/Class-Component/trunk/lib/Class/Component.pm (revision 8659)
+++ lang/perl/Class-Component/trunk/lib/Class/Component.pm (revision 8683)
@@ -104,18 +104,10 @@
     my $pkg;
     if (($pkg = $component) =~ s/^\+// || ($pkg = $c->class_component_load_component_resolver($component))) {
-        if (Class::Inspector->installed($pkg)) {
-            $pkg->require or croak $@;
-        } else {
-            croak "$pkg is not installed";
-        }
+        $pkg->require or croak $@;
     } else {
-        for my $isa_pkg (@{ $class->isa_list_cache($c) }) {
-            my $comp = "$isa_pkg\::Component::$component";
-            next unless Class::Inspector->installed($comp);
-            $comp->require or croak $@;
-            $pkg = $comp;
-            last;
-        }
-        croak "$component is not installed" unless $pkg;
+        unless ($pkg = $class->pkg_require($c => "Component::$component")) {
+            $@ and croak $@;
+            croak "$component is not installed";
+        }
     }
 
@@ -178,12 +170,8 @@
         $pkg->require or croak $@;
     } else {
-        for my $isa_pkg (@{ $class->isa_list_cache($class->_class($c)) }) {
-            my $comp = "$isa_pkg\::Plugin::$plugin";
-            next unless Class::Inspector->installed($comp);
-            $comp->require or croak $@;
-            $pkg = $comp;
-            last;
-        }
-        croak "$plugin is not installed" unless $pkg;
+        unless ($pkg = $class->pkg_require($c => "Plugin::$plugin")) {
+            $@ and croak $@;
+            croak "$plugin is not installed";
+        }
     }
 
@@ -388,4 +376,35 @@
     my($class, $c) = @_;
     ref($c) || $c;
+}
+
+my %pkg_require_cache = ();
+sub pkg_require_cache_clear { %pkg_require_cache = () }
+my $ins = 0;
+sub _pkg_require {
+    my($class, $pkg) = @_;
+
+    if (exists $pkg_require_cache{$pkg}) {
+        return $pkg_require_cache{$pkg} ? $pkg : undef;
+    }
+    $pkg_require_cache{$pkg} = 0;
+
+    return unless Class::Inspector->installed($pkg);
+    $pkg->require or return;
+    $pkg_require_cache{$pkg} = 1;
+
+    return $pkg;
+}
+sub pkg_require {
+    my($class, $c, $pkg) = @_;
+
+    my $pkg2;
+    if (($pkg2 = $pkg) =~ s/^\+//) {
+        return $class->_pkg_require($pkg2);
+    }
+    for my $isa_pkg (@{ $class->isa_list_cache($c) }) {
+        my $ret = $class->_pkg_require("$isa_pkg\::$pkg");
+        return $ret if $ret;
+        return if $@;
+    }
 }
 
