view Lib/IMPL/Resources.pm @ 308:47a09a8dc23a

sync
author sergey
date Thu, 18 Apr 2013 20:06:05 +0400
parents 16ada169ca75
children 1838bdb4d238
line wrap: on
line source

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;