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; |
