annotate _test/temp.pl @ 423:60c2892a577c ref20150831

working on base class system
author cin
date Mon, 02 Apr 2018 07:35:23 +0300
parents b0481c071bea
children 87af445663d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
210
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents: 209
diff changeset
1 #!/usr/bin/perl
6adaeb86945d added IMPL::Web::AutoLocator
sergey
parents: 209
diff changeset
2 use strict;
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
3 use v5.10;
412
30e8c6a74937 working on di container (role based registrations)
cin
parents: 411
diff changeset
4 use Carp;
30e8c6a74937 working on di container (role based registrations)
cin
parents: 411
diff changeset
5 use Time::HiRes qw(gettimeofday tv_interval);
415
3d24b10dd0d5 working on IMPL::Config::Container
cin
parents: 414
diff changeset
6 use Scalar::Util qw(blessed refaddr);
418
cin
parents: 417
diff changeset
7 use YAML::XS qw(Dump Load);
422
b0481c071bea IMPL::Config::Container tests, YAMLConfiguration now works and tested
cin
parents: 419
diff changeset
8 use Data::Dumper;
b0481c071bea IMPL::Config::Container tests, YAMLConfiguration now works and tested
cin
parents: 419
diff changeset
9 use URI;
418
cin
parents: 417
diff changeset
10
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
11 #my $method = _get_ctor("Box", undef, '@_');
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
12
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
13 _invoke_ctor("main","x","y","z");
60c2892a577c working on base class system
cin
parents: 422
diff changeset
14 _invoke_ctor("main","x","y","z");
60c2892a577c working on base class system
cin
parents: 422
diff changeset
15
60c2892a577c working on base class system
cin
parents: 422
diff changeset
16 sub _invoke_ctor {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
17 my ($self) = @_;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
18 no strict 'refs';
60c2892a577c working on base class system
cin
parents: 422
diff changeset
19 no warnings 'redefine';
60c2892a577c working on base class system
cin
parents: 422
diff changeset
20
60c2892a577c working on base class system
cin
parents: 422
diff changeset
21 my $method = _get_ctor("Box", undef, '@_');
60c2892a577c working on base class system
cin
parents: 422
diff changeset
22
60c2892a577c working on base class system
cin
parents: 422
diff changeset
23 *{"${self}::_invoke_ctor"} = $method;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
24
60c2892a577c working on base class system
cin
parents: 422
diff changeset
25 goto &$method;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
26 }
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
27
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
28 sub _get_ctor {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
29 my ($class, $prev, $t) = @_;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
30 no strict 'refs';
60c2892a577c working on base class system
cin
parents: 422
diff changeset
31
60c2892a577c working on base class system
cin
parents: 422
diff changeset
32 #say "_get_ctor($class, $prev, $t)";
60c2892a577c working on base class system
cin
parents: 422
diff changeset
33
60c2892a577c working on base class system
cin
parents: 422
diff changeset
34 my $isolate = ((not defined($t)) or ($t ne '@_'));
60c2892a577c working on base class system
cin
parents: 422
diff changeset
35
60c2892a577c working on base class system
cin
parents: 422
diff changeset
36 my $ctor = $isolate ? *{"${class}::CTOR"}{CODE} : _chain_call(*{"${class}::CTOR"}{CODE}, $prev);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
37
60c2892a577c working on base class system
cin
parents: 422
diff changeset
38 foreach my $base (@{"${class}::ISA"}) {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
39 $ctor = _get_ctor($base, $ctor, exists ${"${class}::ISA"}{$base} ? ${"${class}::ISA"}{$base} : '@_');
60c2892a577c working on base class system
cin
parents: 422
diff changeset
40 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
41
60c2892a577c working on base class system
cin
parents: 422
diff changeset
42 if ($isolate) {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
43 $ctor = _chain_call(_chain_params($ctor, $t), $prev);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
44 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
45
60c2892a577c working on base class system
cin
parents: 422
diff changeset
46 return $ctor;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
47 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
48
60c2892a577c working on base class system
cin
parents: 422
diff changeset
49 sub _chain_call {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
50 my ($method, $next) = @_;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
51
60c2892a577c working on base class system
cin
parents: 422
diff changeset
52 return $method unless $next;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
53 return $next unless $method;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
54
60c2892a577c working on base class system
cin
parents: 422
diff changeset
55 return sub { &$method(@_); goto &$next; }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
56 }
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
57
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
58 sub _chain_params {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
59 my ($method, $prepare) = @_;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
60
60c2892a577c working on base class system
cin
parents: 422
diff changeset
61 return unless $method;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
62
60c2892a577c working on base class system
cin
parents: 422
diff changeset
63 if (not defined $prepare) {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
64 return sub { @_ = (shift); goto &$method };
60c2892a577c working on base class system
cin
parents: 422
diff changeset
65 } elsif ($prepare eq '@_') {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
66 return $method;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
67 } elsif (ref $prepare eq 'CODE') {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
68 return sub {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
69 @_ = (shift, &$prepare(@_));
60c2892a577c working on base class system
cin
parents: 422
diff changeset
70 goto &$method;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
71 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
72 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
73 }
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
74
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
75 package Obj;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
76
60c2892a577c working on base class system
cin
parents: 422
diff changeset
77 sub CTOR {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
78 say "Obj ", join (',', @_);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
79 say Carp::longmess();
60c2892a577c working on base class system
cin
parents: 422
diff changeset
80 }
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
81
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
82 package Foo;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
83
60c2892a577c working on base class system
cin
parents: 422
diff changeset
84 BEGIN {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
85 our @ISA = qw(Obj);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
86 our %ISA = (
60c2892a577c working on base class system
cin
parents: 422
diff changeset
87 Obj => sub { "hi" }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
88 );
60c2892a577c working on base class system
cin
parents: 422
diff changeset
89 }
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
90
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
91 sub CTOR {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
92 say "Foo ", join (',', @_);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
93 }
417
3ed0c58e9da3 working on di container, tests
cin
parents: 415
diff changeset
94
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
95 package Bar;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
96
60c2892a577c working on base class system
cin
parents: 422
diff changeset
97 BEGIN {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
98 our @ISA = qw(Foo);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
99 our %ISA = (
60c2892a577c working on base class system
cin
parents: 422
diff changeset
100 Foo => undef
60c2892a577c working on base class system
cin
parents: 422
diff changeset
101 );
60c2892a577c working on base class system
cin
parents: 422
diff changeset
102 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
103
60c2892a577c working on base class system
cin
parents: 422
diff changeset
104 sub CTOR {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
105 say "Bar ", join(',', @_);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
106 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
107
60c2892a577c working on base class system
cin
parents: 422
diff changeset
108 package Baz;
422
b0481c071bea IMPL::Config::Container tests, YAMLConfiguration now works and tested
cin
parents: 419
diff changeset
109
423
60c2892a577c working on base class system
cin
parents: 422
diff changeset
110 sub CTOR {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
111 say "Baz ", join(',', @_);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
112 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
113
60c2892a577c working on base class system
cin
parents: 422
diff changeset
114 package Box;
60c2892a577c working on base class system
cin
parents: 422
diff changeset
115
60c2892a577c working on base class system
cin
parents: 422
diff changeset
116 BEGIN {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
117 our @ISA = qw(Bar Baz);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
118 our %ISA = (
60c2892a577c working on base class system
cin
parents: 422
diff changeset
119 Bar => sub { shift . "~Box->Bar", @_; },
60c2892a577c working on base class system
cin
parents: 422
diff changeset
120 Baz => sub { shift . "~Box->Baz", @_; }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
121 );
60c2892a577c working on base class system
cin
parents: 422
diff changeset
122 }
60c2892a577c working on base class system
cin
parents: 422
diff changeset
123
60c2892a577c working on base class system
cin
parents: 422
diff changeset
124 sub CTOR {
60c2892a577c working on base class system
cin
parents: 422
diff changeset
125 say "Box ", join(',', @_);
60c2892a577c working on base class system
cin
parents: 422
diff changeset
126 }
422
b0481c071bea IMPL::Config::Container tests, YAMLConfiguration now works and tested
cin
parents: 419
diff changeset
127
407
c6e90e02dd17 renamed Lib->lib
cin
parents: 406
diff changeset
128 1;