49
|
1 package IMPL::DOM::Property;
|
|
2 use strict;
|
|
3 use warnings;
|
|
4
|
|
5 use IMPL::Class::Property;
|
|
6 require IMPL::Exception;
|
|
7
|
|
8 use base qw(Exporter);
|
|
9 our @EXPORT_OK = qw(_dom);
|
|
10
|
|
11 sub _dom($) {
|
|
12 my ($prop_info) = @_;
|
|
13 $prop_info->Implementor( 'IMPL::DOM::Property' );
|
|
14 return $prop_info;
|
|
15 }
|
|
16
|
|
17 sub Make {
|
|
18 my ($self,$propInfo) = @_;
|
|
19
|
|
20 my ($class,$name,$virt,$access,$mutators) = $propInfo->get qw(Class Name Virtual Access Mutators);
|
|
21
|
|
22 die new IMPL::InvalidOperationException("DOM properties can be declared only for the DOM objects") unless $class->isa('IMPL::DOM::Node');
|
|
23
|
|
24 no strict 'refs';
|
|
25 die new IMPL::InvalidOperationException("Custom mutators are not allowed","${class}::$name") if ref $mutators;
|
|
26 if (($mutators & prop_all) == prop_all) {
|
|
27 *{"${class}::$name"} = sub {
|
|
28 $_[0]->nodeProperty($name,@_[1..$#_]);
|
|
29 };
|
|
30 $propInfo->canGet(1);
|
|
31 $propInfo->canSet(1);
|
|
32 } elsif( $mutators & prop_get ) {
|
|
33 *{"${class}::$name"} = sub {
|
|
34 die new IMPL::InvalidOperationException("This is a readonly property", "${class}::$name") if @_>1;
|
|
35 $_[0]->nodeProperty($name);
|
|
36 };
|
|
37 $propInfo->canGet(1);
|
|
38 $propInfo->canSet(0);
|
|
39 } elsif( $mutators & prop_set ) {
|
|
40 *{"${class}::$name"} = sub {
|
|
41 die new IMPL::InvalidOperationException("This is a writeonly property", "${class}::$name") if @_<2;
|
|
42 $_[0]->nodeProperty($name,@_[1..$#_]);
|
|
43 };
|
|
44 $propInfo->canGet(0);
|
|
45 $propInfo->canSet(1);
|
|
46 } else {
|
|
47 die new IMPL::InvalidOperationException("Invalid value for the property mutators","${class}::$name",$mutators);
|
|
48 }
|
|
49 }
|
|
50
|
|
51 1;
|
|
52 __END__
|
|
53 =pod
|
|
54
|
|
55 =head1 SYNOPSIS
|
|
56
|
|
57 package TypedNode;
|
|
58
|
|
59 use base qw(IMPL::DOM::Node);
|
|
60 use IMPL::DOM::Property qw(_dom);
|
|
61
|
|
62 BEGIN {
|
|
63 public _dom property Age => prop_all;
|
|
64 public _dom property Address => prop_all;
|
|
65 public property ServiceData => prop_all;
|
|
66 }
|
|
67
|
|
68 =head1 DESCRIPTION
|
|
69
|
|
70 Позволяет объявлять свойства, которые будут храниться в списке динамических
|
|
71 свойств.
|
|
72
|
|
73 =cut
|