ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/lib/cf.pm
(Generate patch)

Comparing deliantra/server/lib/cf.pm (file contents):
Revision 1.277 by root, Sun Jun 10 04:24:50 2007 UTC vs.
Revision 1.280 by root, Sat Jun 16 14:35:41 2007 UTC

665 _attach $registry, $klass, @attach; 665 _attach $registry, $klass, @attach;
666 } 666 }
667 667
668 $obj->{$name} = \%arg; 668 $obj->{$name} = \%arg;
669 } else { 669 } else {
670 warn "object uses attachment '$name' that is not available, postponing.\n"; 670 warn "object uses attachment '$name' which is not available, postponing.\n";
671 } 671 }
672 672
673 $obj->{_attachment}{$name} = undef; 673 $obj->{_attachment}{$name} = undef;
674} 674}
675 675
943 943
944 cf::override; 944 cf::override;
945 }, 945 },
946); 946);
947 947
948sub load_extension {
949 my ($path) = @_;
950
951 $path =~ /([^\/\\]+)\.ext$/ or die "$path";
952 my $base = $1;
953 my $pkg = $1;
954 $pkg =~ s/[^[:word:]]/_/g;
955 $pkg = "ext::$pkg";
956
957 warn "... loading '$path' into '$pkg'\n";
958
959 open my $fh, "<:utf8", $path
960 or die "$path: $!";
961
962 my $source =
963 "package $pkg; use strict; use utf8;\n"
964 . "#line 1 \"$path\"\n{\n"
965 . (do { local $/; <$fh> })
966 . "\n};\n1";
967
968 unless (eval $source) {
969 my $msg = $@ ? "$path: $@\n"
970 : "extension disabled.\n";
971 if ($source =~ /^#!.*perl.*#.*MANDATORY/m) { # ugly match
972 warn $@;
973 warn "mandatory extension failed to load, exiting.\n";
974 exit 1;
975 }
976 die $@;
977 }
978
979 push @EXTS, $pkg;
980}
981
982sub load_extensions { 948sub load_extensions {
949 cf::sync_job {
950 my %todo;
951
983 for my $ext (<$LIBDIR/*.ext>) { 952 for my $path (<$LIBDIR/*.ext>) {
984 next unless -r $ext; 953 next unless -r $path;
985 eval { 954
986 load_extension $ext; 955 $path =~ /([^\/\\]+)\.ext$/ or die "$path";
956 my $base = $1;
957 my $pkg = $1;
958 $pkg =~ s/[^[:word:]]/_/g;
959 $pkg = "ext::$pkg";
960
961 open my $fh, "<:utf8", $path
962 or die "$path: $!";
963
964 my $source = do { local $/; <$fh> };
965
966 my %ext = (
967 path => $path,
968 base => $base,
969 pkg => $pkg,
970 );
971
972 $ext{meta} = { map { (split /=/, $_, 2)[0, 1] } split /\s+/, $1 }
973 if $source =~ /\A#!.*?perl.*?#\s*(.*)$/m;
974
975 $ext{source} =
976 "package $pkg; use strict; use utf8;\n"
977 . "#line 1 \"$path\"\n{\n"
978 . $source
979 . "\n};\n1";
980
981 $todo{$base} = \%ext;
982 }
983
984 my %done;
985 while (%todo) {
986 my $progress;
987
988 while (my ($k, $v) = each %todo) {
989 for (split /,\s*/, $v->{meta}{depends}) {
990 goto skip
991 unless exists $done{$_};
992 }
993
994 warn "... loading '$k' into '$v->{pkg}'\n";
995
996 unless (eval $v->{source}) {
997 my $msg = $@ ? "$v->{path}: $@\n"
998 : "$v->{base}: extension inactive.\n";
999
1000 if (exists $v->{meta}{mandatory}) {
1001 warn $msg;
1002 warn "mandatory extension failed to load, exiting.\n";
1003 exit 1;
1004 }
1005
1006 warn $msg;
1007 }
1008
1009 $done{$k} = delete $todo{$k};
1010 push @EXTS, $v->{pkg};
1011 $progress = 1;
987 1 1012 }
988 } or warn "$ext not loaded: $@"; 1013
1014 skip:
1015 die "cannot load " . (join ", ", keys %todo) . ": unable to resolve dependencies\n"
1016 unless $progress;
1017 }
989 } 1018 };
990} 1019}
991 1020
992############################################################################# 1021#############################################################################
993 1022
994=head2 CORE EXTENSIONS 1023=head2 CORE EXTENSIONS

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines