1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
#!/usr/bin/env perl
use strict;
use warnings;
use constant {
FOO => { foo => sub { 'Foo' } },
BAR => { bar => sub { 'Bar' } },
BAZ => { baz => sub { 'Baz' } },
};
use Object::Extend qw(extend SINGLETON);
use Test::More tests => 42;
my $object = {};
bless $object;
extend $object, FOO;
isa_ok $object, __PACKAGE__;
isa_ok $object, SINGLETON;
can_ok $object, 'foo';
ok !$object->can('bar');
ok !$object->can('baz');
my $foo_eigenclass = ref($object);
bless $object;
extend $object, BAR;
isa_ok $object, __PACKAGE__;
isa_ok $object, SINGLETON;
can_ok $object, 'bar';
ok !$object->can('foo');
ok !$object->can('baz');
my $bar_eigenclass = ref($object);
bless $object;
extend $object, %{FOO()}, %{BAR()};
isa_ok $object, __PACKAGE__;
isa_ok $object, SINGLETON;
can_ok $object, 'foo';
can_ok $object, 'bar';
my $foo_bar_eigenclass = ref($object);
isnt $foo_eigenclass, $bar_eigenclass;
isnt $foo_eigenclass, $foo_bar_eigenclass;
isnt $bar_eigenclass, $foo_bar_eigenclass;
bless $object;
extend $object, FOO;
is ref($object), $foo_eigenclass;
bless $object;
extend $object, BAR;
is ref($object), $bar_eigenclass;
bless $object;
extend $object, %{FOO()}, %{BAR()};
is ref($object), $foo_bar_eigenclass;
bless $object;
extend $object, %{FOO()}, %{BAZ()};
isnt ref($object), $foo_eigenclass;
isnt ref($object), $bar_eigenclass;
isnt ref($object), $foo_bar_eigenclass;
bless $object;
extend $object, %{BAR()}, %{BAZ()};
isnt ref($object), $foo_eigenclass;
isnt ref($object), $bar_eigenclass;
isnt ref($object), $foo_bar_eigenclass;
bless $object;
extend $object, %{FOO()}, %{BAR()}, %{BAZ()};
isnt ref($object), $foo_eigenclass;
isnt ref($object), $bar_eigenclass;
isnt ref($object), $foo_bar_eigenclass;
my $foo_bar_baz_eigenclass = ref($object);
bless $object;
extend $object, %{FOO()}, %{BAR()}, %{BAZ()};
isnt ref($object), $foo_eigenclass;
isnt ref($object), $bar_eigenclass;
isnt ref($object), $foo_bar_eigenclass;
is ref($object), $foo_bar_baz_eigenclass;
# seperate calls create a chain, so foo-then-bar
# and foo-then-bar-then-baz create new eigenclasses
bless $object;
extend $object, FOO;
is ref($object), $foo_eigenclass;
extend $object, BAR;
isnt ref($object), $foo_bar_eigenclass;
my $foo_then_bar_eigenclass = ref($object);
extend $object, BAZ;
isnt ref($object), $foo_bar_baz_eigenclass;
my $foo_then_bar_then_baz_eigenclass = ref($object);
isnt $foo_bar_eigenclass, $foo_then_bar_eigenclass;
isnt $foo_bar_baz_eigenclass, $foo_then_bar_then_baz_eigenclass;
isnt $foo_then_bar_eigenclass, $foo_then_bar_then_baz_eigenclass;
bless $object;
extend $object, FOO;
is ref($object), $foo_eigenclass;
extend $object, BAR;
is ref($object), $foo_then_bar_eigenclass;
extend $object, BAZ;
is ref($object), $foo_then_bar_then_baz_eigenclass;
|