Mercurial > pub > Impl
comparison Lib/IMPL/declare.pm @ 228:431db7034a88
Для синхронизации
author | andrei <andrei@nap21.upri> |
---|---|
date | Thu, 13 Sep 2012 17:55:01 +0400 |
parents | 2b9b55cfb79b |
children | 6d8092d8ce1b |
comparison
equal
deleted
inserted
replaced
227:70ad6bc20908 | 228:431db7034a88 |
---|---|
1 package IMPL::declare; | 1 package IMPL::declare; |
2 use strict; | 2 use strict; |
3 | 3 |
4 use Scalar::Util qw(set_prototype); | 4 use Scalar::Util qw(set_prototype); |
5 use Carp qw(carp); | 5 use Carp qw(carp); |
6 use IMPL::Class::PropertyInfo(); | |
6 | 7 |
7 sub import { | 8 sub import { |
8 my ($self,$args) = @_; | 9 my ( $self, $args ) = @_; |
9 | 10 |
10 return unless $args; | 11 return unless $args; |
11 | 12 |
12 die "A hash reference is required" unless ref $args eq 'HASH'; | 13 die "A hash reference is required" unless ref $args eq 'HASH'; |
13 | 14 |
14 no strict 'refs'; | 15 no strict 'refs'; |
15 | 16 |
16 my $caller = caller; | 17 my $caller = caller; |
17 | 18 |
18 my $aliases = $args->{require} || {}; | 19 my $aliases = $args->{require} || {}; |
19 | 20 |
20 while( my ($alias, $class) = each %$aliases ) { | 21 while ( my ( $alias, $class ) = each %$aliases ) { |
21 my $c = _require($class); | 22 my $c = _require($class); |
22 | 23 |
23 *{"${caller}::$alias"} = set_prototype(sub { | 24 *{"${caller}::$alias"} = set_prototype( |
24 $c | 25 sub { |
25 }, ''); | 26 $c; |
26 } | 27 }, |
27 | 28 '' |
28 my $base = $args->{base} || {}; | 29 ); |
29 | 30 } |
30 my %ctor; | 31 |
31 my @isa; | 32 my $base = $args->{base} || {}; |
32 | 33 |
33 if (ref $base eq 'ARRAY') { | 34 my %ctor; |
34 carp "Odd elements number in require" unless scalar(@$base)%2 == 0; | 35 my @isa; |
35 while ( my ($class,$mapper) = splice @$base, 0, 2 ) { | 36 |
36 $class = $aliases->{$class} || _require($class); | 37 if ( ref $base eq 'ARRAY' ) { |
37 | 38 carp "Odd elements number in require" |
38 push @isa,$class; | 39 unless scalar(@$base) % 2 == 0; |
39 $ctor{$class} = $mapper; | 40 while ( my ( $class, $mapper ) = splice @$base, 0, 2 ) { |
40 } | 41 $class = $aliases->{$class} || _require($class); |
41 } elsif (ref $base eq 'HASH' ) { | 42 |
42 while ( my ($class,$mapper) = each %$base ) { | 43 push @isa, $class; |
43 $class = $aliases->{$class} || _require($class); | 44 $ctor{$class} = $mapper; |
44 | 45 } |
45 push @isa,$class; | 46 } |
46 $ctor{$class} = $mapper; | 47 elsif ( ref $base eq 'HASH' ) { |
47 } | 48 while ( my ( $class, $mapper ) = each %$base ) { |
48 } | 49 $class = $aliases->{$class} || _require($class); |
49 | 50 |
50 *{"${caller}::CTOR"} = \%ctor; | 51 push @isa, $class; |
51 *{"${caller}::ISA"} = \@isa; | 52 $ctor{$class} = $mapper; |
53 } | |
54 } | |
55 | |
56 my $props = $args->{props} || []; | |
57 | |
58 if ( $props eq 'HASH' ) { | |
59 $props = [%$props]; | |
60 } | |
61 | |
62 die "A hash or an array reference is required in the properties list" | |
63 unless ref $props eq 'ARRAY'; | |
64 | |
65 carp "Odd elements number in properties declaration of $caller" | |
66 unless scalar(@$props) % 2 == 0; | |
67 | |
68 if (@$props) { | |
69 for ( my $i = 0 ; $i < @$props - 1 ; $i = $i + 2 ) { | |
70 my ( $prop, $spec ) = @{$props}[ $i, $i + 1 ]; | |
71 | |
72 my $propInfo = IMPL::Class::PropertyInfo->new( | |
73 { | |
74 Name => $prop, | |
75 Mutators => $spec, | |
76 Class => $caller, | |
77 Access => $prop =~ /^_/ | |
78 ? IMPL::Class::MemberInfo::MOD_PRIVATE | |
79 : IMPL::Class::MemberInfo::MOD_PUBLIC | |
80 } | |
81 ); | |
82 $propInfo->Implement(); | |
83 } | |
84 } | |
85 | |
86 *{"${caller}::CTOR"} = \%ctor; | |
87 *{"${caller}::ISA"} = \@isa; | |
52 } | 88 } |
53 | 89 |
54 sub _require { | 90 sub _require { |
55 my ($class) = @_; | 91 my ($class) = @_; |
56 | 92 |
57 if (not $class =~ s/^-//) { | 93 if ( not $class =~ s/^-// ) { |
58 (my $file = $class) =~ s/::|'/\//g; | 94 ( my $file = $class ) =~ s/::|'/\//g; |
59 require "$file.pm"; | 95 require "$file.pm"; |
60 } | 96 } |
61 $class; | 97 $class; |
62 } | 98 } |
63 | |
64 | 99 |
65 1; | 100 1; |
66 | 101 |
67 __END__ | 102 __END__ |
68 | 103 |