Changeset 6792
- Timestamp:
- 09/06/05 13:05:40 (3 years ago)
- Location:
- perl5/Perl6-MetaModel2.0
- Files:
-
- 7 modified
-
lib/genesis.pl (modified) (1 diff)
-
lib/gnosis.pl (modified) (1 diff)
-
lib/metamorph.pl (modified) (2 diffs)
-
t/03_metamorph.t (modified) (4 diffs)
-
t/05_genesis.t (modified) (3 diffs)
-
t/06_bootstrapped.t (modified) (3 diffs)
-
t/07_Perl6_MetaModel.t (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
perl5/Perl6-MetaModel2.0/lib/genesis.pl
r6557 r6792 6 6 BEGIN { do "lib/pneuma.pl" }; 7 7 8 ## Now create some of the other things we need ... 9 10 ## ---------------------------------------------------------------------------- 11 ## Module 12 13 $::Module = $::Class->new('$:name' => 'Module'); 14 15 $::Module->superclasses([ $::Object ]); 16 17 $::Module->add_attribute('$:name' => ::make_attribute('$:name')); 18 $::Module->add_attribute('$:version' => ::make_attribute('$:version')); 19 $::Module->add_attribute('$:authority' => ::make_attribute('$:authority')); 20 21 $::Module->add_method('name' => ::make_method(sub { 22 my $self = shift; 23 ::opaque_instance_attrs($self)->{'$:name'} = shift if @_; 24 ::opaque_instance_attrs($self)->{'$:name'}; 25 }, $::Module)); 26 27 $::Module->add_method('version' => ::make_method(sub { 28 my ($self, $version) = @_; 29 if (defined $version) { 30 ($version =~ /^\d+\.\d+\.\d+$/) 31 || confess "The version ($version) is not in the correct format '0.0.0'"; 32 ::opaque_instance_attrs($self)->{'$:version'} = $version; 33 } 34 ::opaque_instance_attrs($self)->{'$:version'}; 35 }, $::Module)); 36 37 $::Module->add_method('authority' => ::make_method(sub { 38 my $self = shift; 39 ::opaque_instance_attrs($self)->{'$:authority'} = shift if @_; 40 ::opaque_instance_attrs($self)->{'$:authority'}; 41 }, $::Module)); 42 43 $::Module->add_method('identifier' => ::make_method(sub { 44 return join '-' => ($::SELF->name, $::SELF->version, ($::SELF->authority || ())); 45 }, $::Module)); 46 8 47 # ... this makes ::Class a subclass of ::Object 9 48 # the result of this is (Theos) 10 49 11 50 # < Class is a subclass of Object > 12 ::opaque_instance_attrs($::Class)->{'@:superclasses'} = [ $:: Object ];51 ::opaque_instance_attrs($::Class)->{'@:superclasses'} = [ $::Module, $::Object ]; 13 52 14 ::opaque_instance_attrs($::Class)->{'@:MRO'} = [ $::Class, $::Object ]; 53 # NOTE: 54 # this is to avoid recursion 55 ::opaque_instance_attrs($::Class)->{'@:MRO'} = [ $::Class, $::Module, $::Object ]; 15 56 ::opaque_instance_attrs($::Object)->{'@:MRO'} = [ $::Object ]; 16 57 58 ## ---------------------------------------------------------------------------- 59 ## Role 60 61 $::Role = $::Class->new('$:name' => 'Role'); 62 63 $::Role->superclasses([ $::Module ]); 64 65 $::Role->add_attribute('@:subroles' => ::make_attribute('@:subroles')); 66 $::Role->add_attribute('%:methods' => ::make_attribute('%:methods')); 67 $::Role->add_attribute('%:attributes' => ::make_attribute('%:attributes')); 68 69 $::Role->add_method('add_method' => ::make_method(sub { 70 my ($self, $label, $method) = @_; 71 # NOTE: 72 # the $method here can be undefined, this is to allow 73 # for methods which do not have an implementation. These 74 # methods are then required to be implemented by the 75 # composing class. 76 # (see A12/Class Composition with Roles/Declaration of Roles/Interfaces) 77 ::opaque_instance_attrs($self)->{'%:methods'}->{$label} = $method; 78 }, $::Role)); 79 80 $::Role->add_method('get_method_list' => ::make_method(sub { 81 keys %{::opaque_instance_attrs($::SELF)->{'%:methods'}}; 82 }, $::Role)); 83 84 $::Role->add_method('add_attribute' => ::make_method(sub { 85 my ($self, $label, $attribute) = @_; 86 ::opaque_instance_attrs($self)->{'%:attributes'}->{$label} = $attribute; 87 }, $::Role)); 88 89 $::Role->add_method('get_attribute_list' => ::make_method(sub { 90 keys %{::opaque_instance_attrs($::SELF)->{'%:attributes'}}; 91 }, $::Role)); 92 93 $::Role->add_method('subroles' => ::make_method(sub { 94 my $self = shift; 95 ::opaque_instance_attrs($self)->{'@:subroles'} = shift if @_; 96 ::opaque_instance_attrs($self)->{'@:subroles'}; 97 }, $::Role)); 98 99 $::Role->add_method('does' => ::make_method(sub { 100 my $self = shift; 101 if (my $role_name = shift) { 102 foreach (@{::opaque_instance_attrs($self)->{'@:subroles'}}) { 103 return 1 if $_->name eq $role_name; 104 } 105 return 0; 106 } 107 return map { $_->name } @{::opaque_instance_attrs($self)->{'@:subroles'}}; 108 }, $::Role)); 109 110 17 111 1; -
perl5/Perl6-MetaModel2.0/lib/gnosis.pl
r6669 r6792 16 16 ( 17 17 # meta-information 18 '$:name' => $attrs{'$:name'} || undef, 19 '$:version' => $attrs{'$:version'} || '0.0.0', 20 '$:authority' => $attrs{'$:authority'} || undef, 18 '$:name' => $attrs{'$:name'} || undef, 21 19 # the guts 22 20 '@:MRO' => [], -
perl5/Perl6-MetaModel2.0/lib/metamorph.pl
r6766 r6792 99 99 ::opaque_instance_attrs($self)->{'$:name'} = shift if @_; 100 100 ::opaque_instance_attrs($self)->{'$:name'}; 101 }, $::Class));102 103 $::Class->add_method('version' => ::make_method(sub {104 my ($self, $version) = @_;105 if (defined $version) {106 ($version =~ /^\d+\.\d+\.\d+$/)107 || confess "The version ($version) is not in the correct format '0.0.0'";108 ::opaque_instance_attrs($self)->{'$:version'} = $version;109 }110 ::opaque_instance_attrs($self)->{'$:version'};111 }, $::Class));112 113 $::Class->add_method('authority' => ::make_method(sub {114 my $self = shift;115 ::opaque_instance_attrs($self)->{'$:authority'} = shift if @_;116 ::opaque_instance_attrs($self)->{'$:authority'};117 }, $::Class));118 119 $::Class->add_method('identifier' => ::make_method(sub {120 return join '-' => ($::SELF->name, $::SELF->version, ($::SELF->authority || ()));121 101 }, $::Class)); 122 102 … … 389 369 390 370 $::Class->add_attribute('$:name' => ::make_attribute('$:name')); 391 $::Class->add_attribute('$:version' => ::make_attribute('$:version'));392 $::Class->add_attribute('$:authority' => ::make_attribute('$:authority'));393 371 $::Class->add_attribute('@:MRO' => ::make_attribute('@:MRO')); 394 372 $::Class->add_attribute('@:superclasses' => ::make_attribute('@:superclasses')); -
perl5/Perl6-MetaModel2.0/t/03_metamorph.t
r6557 r6792 4 4 use warnings; 5 5 6 use Test::More tests => 88;6 use Test::More tests => 72; 7 7 use Test::Exception; 8 8 … … 28 28 $::Class->name; 29 29 } 'Class', '... got the name we expected'; 30 31 lives_ok_and_is {32 $::Class->version;33 } '0.0.0', '... got the version we expected';34 35 lives_ok_and_is {36 $::Class->authority;37 } undef, '... got the authority we expected';38 39 lives_ok_and_is {40 $::Class->identifier;41 } 'Class-0.0.0', '... got the identifier we expected';42 30 43 31 lives_ok_and_is { … … 86 74 # check public methods 87 75 foreach my $method_name (qw(name 88 version89 authority90 identifier91 76 superclasses 92 77 MRO … … 120 105 } 121 106 122 my @attribute_name_list = ('$:name', 123 '$:version', 124 '$:authority', 107 my @attribute_name_list = ('$:name', 125 108 '@:MRO', 126 109 '@:superclasses', -
perl5/Perl6-MetaModel2.0/t/05_genesis.t
r6692 r6792 4 4 use warnings; 5 5 6 use Test::More tests => 28;6 use Test::More tests => 47; 7 7 use Test::Exception; 8 8 … … 11 11 is_deeply( 12 12 $::Class->superclasses, 13 [ $:: Object ],14 '... $::Class->superclasses() is $::Object');13 [ $::Module, $::Object ], 14 '... $::Class->superclasses() is [ $::Module, $::Object ]'); 15 15 16 16 is_deeply( … … 21 21 is_deeply( 22 22 [ $::Class->MRO() ], 23 [ $::Class, $::Object ], 24 '... $::Class->MRO() is ($::Class, $::Object)'); 23 [ $::Class, $::Module, $::Object ], 24 '... $::Class->MRO() is ($::Class, $::Module, $::Object)'); 25 26 ok($::Class->is_a('Module'), '... $::Class->is_a(Module)'); 27 ok($::Class->isa('Module'), '... $::Class->isa(Module)'); 25 28 26 29 ok($::Class->is_a('Object'), '... $::Class->is_a(Object)'); 27 30 ok($::Class->isa('Object'), '... $::Class->isa(Object)'); 28 31 29 # can call all of Object's class methods ... 30 foreach my $method_name (qw(new bless CREATE isa can)) { 32 ok($::Object->is_a('Object'), '... $::Object->is_a(Object)'); 33 ok($::Object->isa('Object'), '... $::Object->isa(Object)'); 34 35 ok($::Module->is_a('Object'), '... $::Module->is_a(Object)'); 36 ok($::Module->isa('Object'), '... $::Module->isa(Object)'); 37 38 # Module can call all of Modules's methods and all of Object's ... 39 foreach my $method_name (qw(name version authority identifier 40 BUILD BUILDALL DESTROYALL isa can)) { 41 ok($::Module->can($method_name), '... Module->can(' . $method_name . ')'); 42 } 43 44 # Class can call all of Modules's methods ... 45 foreach my $method_name (qw(name version authority identifier)) { 31 46 ok($::Class->can($method_name), '... Class->can(' . $method_name . ')'); 32 47 } 33 48 34 # can call all of Object's instance methods as well ... 49 # Object can call all of Modules's methods ... 50 foreach my $method_name (qw(name version authority identifier)) { 51 ok($::Object->can($method_name), '... Object->can(' . $method_name . ')'); 52 } 53 54 # can call all of Object's methods as well ... 35 55 foreach my $method_name (qw(BUILD BUILDALL DESTROYALL isa can)) { 36 56 ok($::Class->can($method_name), '... Class->can(' . $method_name . ')'); 37 57 } 38 58 39 # now call some Object methods 40 41 ok($::Object->isa('Object'), '... Object->isa(Object)'); 42 43 foreach my $method_name (qw(new bless CREATE isa can)) { 44 ok($::Object->can($method_name), '... Object->can(' . $method_name . ')'); 45 } 59 # now create an Object 46 60 47 61 my $iObject = $::Object->new(); 48 62 ok($iObject->isa('Object'), '... iObject->isa(Object)'); 49 63 50 is($iObject->id, 3, '... $iObject isthe third object in the system');64 cmp_ok($iObject->id, '>', 3, '... $iObject is at least the third object in the system'); 51 65 52 66 foreach my $method_name (qw(BUILD BUILDALL DESTROYALL isa can)) { 53 67 ok($iObject->can($method_name), '... iObject->can(' . $method_name . ')'); 54 68 } 69 70 # now create a Module 71 72 # now create an Object 73 74 my $MyModule = $::Module->new(); 75 ok($MyModule->isa('Module'), '... MyModule->isa(Module)'); 76 ok($MyModule->isa('Object'), '... MyModule->isa(Object)'); 77 78 cmp_ok($MyModule->id, '>', 3, '... $MyModule is the at least the third object in the system'); 79 80 # Module can call all of Modules's methods and all of Object's ... 81 foreach my $method_name (qw(name version authority identifier)) { 82 ok($MyModule->can($method_name), '... MyModule->can(' . $method_name . ')'); 83 } 84 85 86 -
perl5/Perl6-MetaModel2.0/t/06_bootstrapped.t
r6692 r6792 4 4 use warnings; 5 5 6 use Test::More tests => 1 4;6 use Test::More tests => 18; 7 7 use Test::Exception; 8 8 … … 14 14 is($Foo->name, 'Foo', '... Foo->name == Foo'); 15 15 is($Foo->version, '0.0.1', '... Foo->version == 0.0.1'); 16 is($Foo->authority, undef, '... Foo->authority == undef'); 17 18 is($Foo->identifier, 'Foo-0.0.1', '... Foo->identifier == Foo-0.0.1'); 16 19 17 20 lives_ok { … … 33 36 # Now try to create a new class .... 34 37 35 my $Bar = $::Class->new('$:name' => 'Bar', '$:version' => '0.0.1' );38 my $Bar = $::Class->new('$:name' => 'Bar', '$:version' => '0.0.1', '$:authority' => 'cpan:JRANDOM'); 36 39 is($Bar->name, 'Bar', '... Bar->name == Bar'); 37 40 is($Bar->version, '0.0.1', '... Bar->version == 0.0.1'); 41 is($Bar->authority, 'cpan:JRANDOM', '... Bar->authority == cpan:JRANDOM'); 42 43 is($Bar->identifier, 'Bar-0.0.1-cpan:JRANDOM', '... Bar->identifier == Bar-0.0.1-cpan:JRANDOM'); 38 44 39 45 lives_ok { -
perl5/Perl6-MetaModel2.0/t/07_Perl6_MetaModel.t
r6610 r6792 4 4 use warnings; 5 5 6 use Test::More tests => 2 6;6 use Test::More tests => 27; 7 7 use Test::Exception; 8 8 … … 12 12 ok($::Object->isa('Object'), '... genesis was loaded ok'); 13 13 ok($::Class->isa('Class'), '... genesis was loaded ok'); 14 ok($::Class->isa('Module'), '... genesis was loaded ok'); 14 15 ok($::Class->isa('Object'), '... genesis was loaded ok'); 15 16 is_deeply( 16 17 $::Class->superclasses, 17 [ $:: Object ],18 [ $::Module, $::Object ], 18 19 '... genesis was loaded ok'); 19 20
