Mercurial > pub > Impl
comparison Lib/IMPL/Web/View/Metadata/ObjectProvider.pm @ 362:715b9959b207
WebView: initial work on metadata providers
author | cin |
---|---|
date | Thu, 28 Nov 2013 20:00:20 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
361:eff7f75a4408 | 362:715b9959b207 |
---|---|
1 package IMPL::Web::View::Metadata::ObjectProvider; | |
2 use strict; | |
3 | |
4 use IMPL::lang; | |
5 use IMPL::declare { | |
6 require => { | |
7 Exception => 'IMPL::Exception', | |
8 ArgException => '-IMPL::InvalidArgumentException', | |
9 Meta => 'IMPL::Web::View::Metadata', | |
10 PropertyInfo => 'IMPL::Class::PropertyInfo' | |
11 }, | |
12 base => [ | |
13 'IMPL::Object' => undef | |
14 ] | |
15 }; | |
16 | |
17 sub GetMetadata { | |
18 my ($this,$model) = @_; | |
19 | |
20 my $class = typeof($model) || $model; | |
21 | |
22 return Meta->new( | |
23 type => $class, | |
24 provider => $this | |
25 ); | |
26 } | |
27 | |
28 # returns array of metadata | |
29 sub GetFields { | |
30 my ($this,$class) = @_; | |
31 | |
32 my %seen; | |
33 | |
34 return map { | |
35 my %meta = ( | |
36 provider => $this | |
37 ); | |
38 | |
39 $meta{type} = $_->type if $_->type; | |
40 | |
41 # TODO extend from metadata and external providers | |
42 | |
43 return Meta->new(%meta); | |
44 } $class->GetMeta(PropertyInfo, sub { $seen{$_->name} ? 0 : ($seen{$_->name} = 1) } , 1); | |
45 | |
46 } | |
47 | |
48 1; |