OSDN Git Service

a1ab7cb79425e2f469d2bc68860b3802dfc6c94d
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Model / Loader.pm
1 package Newslash::Model::Loader;
2
3 use strict;
4 use warnings;
5 use utf8;
6 use feature ':5.10';
7
8 use Module::Load qw(load);
9
10 sub import {
11     my $class = shift;
12     my $caller = caller;
13
14     {
15         no strict 'refs';
16         *{"$caller\::load"} = \&load_model;
17         *{"$caller\::loader"} = \&loader;
18     }
19
20     $_->import for qw(strict warings utf8);
21     feature->import(':5.10');
22 }
23
24 state $models;
25
26 sub loader {
27     my ($self, $opts) = @_;
28     my $r = $models;
29     return sub {
30         my $caller = shift;
31         my $a = shift || $caller;
32         my $c = $r->{$a};
33
34         if ($c) {
35             my $ret = $c->new($opts);
36             return $ret;
37         }
38     };
39 }
40
41 sub load_model {
42     my ($accessor, $class) = @_;
43     load $class;
44     if (!$models) {
45         $models = {};
46     }
47     $models->{$accessor} = $class;
48 }
49
50 1;
51