diff Lib/IMPL/Resources.pm @ 0:03e58a454b20

Создан репозитарий
author Sergey
date Tue, 14 Jul 2009 12:54:37 +0400
parents
children 16ada169ca75
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Resources.pm	Tue Jul 14 12:54:37 2009 +0400
@@ -0,0 +1,59 @@
+package IMPL::Resources;
+use strict;
+use warnings;
+
+our $Encoding ||= 'utf-8';
+our %Files;
+
+my %Data;
+
+
+    foreach my $group (keys %Files) {
+        $Data{$group} = ParseResource($Files{$group});
+    }
+
+sub findFile {
+    my ($fname) = @_;
+    
+    foreach my $dir (',',@INC) {
+        my $fullfname = "$dir/$fname";
+        return $fullfname if -f $fullfname;
+    }
+    
+    return $fname;
+}
+    
+sub ParseResource {
+    my ($fname) = @_;
+    
+    open my $hRes, "<:encoding($Encoding)", findFile($fname) or die "Failed to open file $fname: $!";
+    
+    my %Map;
+    my $line = 1;
+    while (<$hRes>) {
+        chomp;
+        $line ++ and next if /^\s*$/;
+        
+        if (/^(\w+)\s*=\s*(.*)$/) {
+            $Map{$1} = $2;
+        } else {
+            die "Invalid resource format in $fname at $line";
+        }
+        $line ++;
+    }
+    
+    return \%Map;
+}
+
+sub import {
+    my ($class,@groups) = @_;
+    my $caller = caller;
+    my %merged = map %{$Data{$_} || {} }, @groups;
+    
+    no strict 'refs';
+    foreach my $item ( keys %merged ) {
+        *{"${caller}::ids_$item"} = sub { sprintf($merged{$item},@_) } 
+    }
+}
+
+1;